为什么以下代码的输出是这样的?
char str[] = {'i', 't', 'i', 's', 'm', 'e', '\0'}; //this code equates to 7 bytes
char* str[] = {'i', 't', 'i', 's', 'm', 'e', '\0'}; //this code equates to 28 bytes
答案 0 :(得分:7)
此代码不符合您的想法。它使用char
常量来初始化char*
指针数组的元素。这样的“指针”不会指向你的角色;相反,它们具有相应字符的数值!
系统上的每个字符指针都是4个字节长,这解释了结果。
答案 1 :(得分:1)
您的编译器应该为此
发出警告char *str[] = {'i', 't', 'i', 's', 'm', 'e', '\0'};
实际元素的类型与数组元素的类型不兼容。
答案 2 :(得分:1)
指针的大小默认为环境地址宽度,因为指针必须能够覆盖理论上可用的地址空间,即指向当前系统体系结构中可能的任何地址。在32位系统中,无论是指向char
还是double
。指针数组的大小等于number_of_array_elements*size_of_pointer
。
#include <stdio.h>
int main (void)
{
char str[] = {'i', 't', 'i', 's', 'm', 'e', '\0'}; //this code equals 7*sizeof(char)
char* str1[] = {"i", "t", "i", "s", "m", "e", "\0"}; //this code equals 7*sizeof(char*)
printf("%zu\t%zu\n", sizeof(str), sizeof(str1));
return 0;
}
此SO post也可能值得一读。