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;
}
在32位机器上,在对齐为4情况下,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;
结果为32:(4+4+8+4+1+3+4+4)橙色字体为填充的
strlen("\0")与sizeof("\0")
strlen("\0") = 0
,sizeof("\0") = 2
。
strlen
strlen用来计算字符串的长度,它从内存的某个位置开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值
#include <stdio.h>
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的字符数组的引用,所以输出大小为10 - 最后两行
printf
分别输出sizeof(char[2])
和sizeof(char &)
,前者表示字符数组char[2]
的大小,即两个字符占用的空间大小,为2; - 后者表示对字符的引用占用空间大小,一般为1个字节。