- struct A
- {
- long num;
- char *name;
- short int data;
- char ha;
- short ba[5];
- } *p;
-
- int main()
- {
-
- printf("结构体A的大小:%d\n", sizeof(struct A));
- printf("num的大小:%d\n", sizeof(((struct A *)0)->num));
- printf("name的大小:%d\n", sizeof(((struct A *)0)->name));
- printf("data的大小:%d\n", sizeof(((struct A *)0)->data));
- printf("ha大小:%d\n", sizeof(((struct A *)0)->ha));
- printf("ba的大小:%d\n", sizeof(((struct A *)0)->ba));
- return 0;
- }
sizeof(long)
的结果为4字节,sizeof(char*)
的结果为4字节,sizeof(short int)
的结果与sizeof(short)
的结果都为2字节,sizeof(char)
的结果为1字节,sizeof(int)
的结果为4字节- struct B
- {
- float num;
- double b;
- char *name;
- char c;
- int data;
-
- } *D;
strlen("\0") = 0
,sizeof("\0") = 2
。
strlen
strlen用来计算字符串的长度,它从内存的某个位置开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值
-
- #include
-
- int main()
- {
- char arr1[] = {'a', 'b', 'c', 'd', 'e', 'f'};
- char arr2[] = {'a', 'b', 'c', 'd', 'e', 'f', '\0'};
- char arr3[] = {'a', 'b', 'c', '\0', 'e', 'f', '\0'};
- printf("%d\n", strlen(arr1)); // 答案为7,视编译器而定
- printf("%d\n", strlen(arr2)); // 答案为6
- printf("%d\n", strlen(arr3)); // 答案为3
- printf("%d\n", strlen("abc\0def")); // 答案为3
-
- printf("%d\n", sizeof(arr1)); // 答案为6
- printf("%d\n", sizeof("abcdef")); // 答案为7
- printf("%d\n", sizeof(arr2)); // 答案为7
- printf("%d\n", sizeof(arr3)); // 答案为7
- printf("%d\n", sizeof("abc\0def")); // 答案为8
-
- return 0;
- }
sizeof
sizeof是C语言的关键字,它以字节的形式给出了其操作数的存储大小,操作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定
sizeof("\0") = 2,
这是因为在C/C++中,字符串字面量(以双引号括起来的字符序列)包括其实际字符内容和一个null终止符('\0')作为字符串的结束标志。因此,字符串 "\0" 实际上包含两个字符:一个是null终止符,另一个是实际的字符。
- void func0(){
- char array[] = "abcdefg";
- printf("%d ", sizeof(array));
- const char *p = "abcdefg";
- printf("%d ", sizeof(p));
- }
- void func1(char p[10])
- {
- printf("%d ", sizeof(p));
- }
- void func2(char (&p)[10])
- {
- printf("%d ", sizeof(p));
- }
- int main()
- {
- char p[10] = "hello";
- func0();
- func1(p);
- func2(p);
- printf("%d ", sizeof(char[2]));
- printf("%d ", sizeof(char &));
- return 0;
- }
func0
函数时,定义了一个字符数组array
并初始化,其大小为7,因为包括末尾的'\0'字符。p
只是指向了字符串常量"abcdefg",占用的内存空间大小与指针类型相关,一般情况下是4或8个字节。所以第一个printf
输出7,第二个printf
输出4或8。func1
和func2
函数时,传入了一个大小为10的字符数组p
,但是在func1
中,p
被视为指向字符的指针,并不知道它的大小,所以输出的大小为4或8;func2
中,p
被视为一个大小为10的字符数组的引用,所以输出大小为10printf
分别输出sizeof(char[2])
和sizeof(char &)
,前者表示字符数组char[2]
的大小,即两个字符占用的空间大小,为2;