针对32位系统和64为系统下sizeof()的大小,包括指针的长度

长度32位系统64位系统
指针4字节8字节
int48
char11
double816

情形一:

#include"stdafx.h"
#include<iostream>
#include<stdio.h>
#include<math.h>

using namespace std;
struct a {
    double aaa;//8byte
    int d;        //4byte
    short b;  //2byte
    char c; //1byte
}aa;
int main() {
    aa={ 3,4,1,'a' };
    cout << sizeof(aa);
    return 0;
}

 

情形二:

#include"stdafx.h"
#include<iostream>

using namespace std;

struct a {

	int d;//4byte
	double aaa;//8byte
	short b;//2byte
	char c; //1byte
}aa;
int main() {
	cout << sizeof(aa)<<endl;
	return 0;
}

经过测试发现,我自己的编译环境好像是32位的,所以int长度为4,它每次生成最大的空间,然后类似于填背包的形式,把小的的塞入大的里面存放,当剩余的内存不足以存放下一个类型的大小时才会开新的最大长度的空间。

 

注意sizeof(指针),这种情况比较特殊,例如如下情况

#include"stdafx.h"
#include<iostream>

using namespace std;

int main() {
	double *type_double = new double;
	int *type_int = new int;

	printf("地址=%p\n", type_double);
	cout << "sizeof(type_double)=" << sizeof(type_double) << endl;
	cout << "sizeof(*type_double)=" << sizeof(*type_double) << endl;
	cout << "sizeof(type_int)=" << sizeof(type_int) << endl;
	cout << "sizeof(*type_int)=" << sizeof(*type_int) << endl;
}

 

如果是对sizeof(type_double),求得是指针地址的长度,该长度是固定的不管是int还是double,都是4,测试环境应该是32位,

如果是sizeof(*type_xxx),相当于sizeof(int),长度为指针a指向的类型的长度,int为4位,double为8位,测试环境应该是32位。

 

情形三:有数组的情况下:

#include"stdafx.h"
#include<iostream>

using namespace std;

typedef struct a {
	double aaa;//8byte
	char c[0]; //1byte     三种不同长度数组
    //char c[5]; 
   //char c[9];
}m;
int main() 
	cout << sizeof(m) << endl;
	return 0;
}

三种结果如下:

### C语言中 `strlen` `sizeof` 的区别 #### 1. 基本概念 - **`strlen()`**: 是一个标准库函数,定义在 `<string.h>` 中。它的作用是返回字符串的实际长度(即从第一个字符到 `\0` 结束之前的字符数量)。因此,它只适用于以 `\0` 结尾的字符串[^2]。 - **`sizeof`**: 不是一个函数,而是C语言中的一个操作符。它可以计算数据类型或对象在内存中占用的空间大小(以字节为单)。对于数组来说,`sizeof` 返回整个数组分配的总字节数[^1]。 #### 2. 使用场景对比 ##### 对于字符串的情况: 假设有一个字符串数组如下: ```c char str[20] = "hello"; ``` - 调用 `strlen(str)` 将返回5,因为该字符串实际包含五个字母'h', 'e', 'l', 'l', 'o'以及终止符`\0`之前的内容[^3]。 - 如果调用了 `sizeof(str)` 则会得到20,这是因为我们声明了一个具有固定尺寸20个字符空间的数组,即使初始化时仅赋值了部分元素[^1]。 #### 3. 数组与非零结束标志的关系 需要注意的是当处理普通的字符型数组而非严格意义上的字符串时两者的差异更加明显: 考虑下面的例子: ```c #include <stdio.h> #include <string.h> int main(){ char arr1[]={'h','e','l','l','o'}; //未显式加'\0' char arr2[]="hello"; //隐含'\0' printf("arr1 strlen:%lu, sizeof:%lu\n", strlen(arr1), sizeof(arr1)); printf("arr2 strlen:%lu, sizeof:%lu\n", strlen(arr2), sizeof(arr2)); return 0; } ``` 这里如果尝试运行上面程序可能会引发错误或者不确定行为,因为在第一次打印语句里试图对未经适当终结标记(`\0`)设置好的序列应用`strlen`,这违反了前提条件[^4]. 但是第二行输出正常工作因为它自动包含了必要的null terminator. 所以总结起来就是: - 当面对真正的C-style strings (由连续字符组成并以 '\0' 终结),两者都可以有效运作但提供不同类型的资讯; - 只针对原始资料结构如单纯的一维或多维度数值列表,则只有通过`sizeof`能够获得确切容量信息。 ### 示例代码展示 以下是综合比较的一个简单实例演示如何区分这两种方法的结果: ```c #include<stdio.h> #include<string.h> void showDetails(char array[]) { printf ("Size of Array : %zu bytes \n", sizeof(array)); printf ("Length using Strlen():%zu characters\n ", strlen((const char *)array)); } int main(){ const char myStringLiteral[]={"Sample Text."}; puts(myStringLiteral); /* Passes pointer to function */ showDetails(&myStringLiteral); return 0 ; } ``` 此段落再次强调了传递给函数参数后sizeOf表现形式改变的现象由于退化成指针特性丢失原有规模属性从而总是显示固定的地址宽度而不是原来实体占据区域范围内的全部比特数[^4].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值