如果我有一个字符串:
char s1[]="hello, how are you?";
printf("%d\n",sizeof(s1));
Run Code Online (Sandbox Code Playgroud)
它打印出确切的,正确数量的字符,但是如果我有一个由指针初始化的字符串:
char *s2;
s2=(char*)malloc(sizeof(char));
strcpy(s2,s1);
printf("%d\n",sizeof(s2));
Run Code Online (Sandbox Code Playgroud)
它打印指针的大小,这取决于机器(在我的机器上,8).那么为什么s2为8个字节,s1为20个字节,因为它们是相同的字符串?
sve*_*rre 10
它们不是相同的字符串,甚至是相同的类型.char s2[]是一个数组,它的大小是其元素大小的总和.char *s2是一个指针,它有一个指针的大小.
sizeof()是(在C89中)一个编译时运算符,它必须在编译时知道它的参数大小.由于指针可以来自任何地方,sizeof()无法知道已分配内存的大小,但是数组在编译时总是给出一个大小(C99的VLA除外),然后sizeof()可以返回该内存的大小.