我正在尝试在 C 中初始化数组和字符串的方法,并发现:
char *str = "ABCDE";
完美地初始化字符串,没有错误或警告,但是:
int *array = {1,2,3,4,5};
给我警告并最终转储核心。现在真的让我很烦恼,我想知道为什么这种声明适用于字符但不适用于整数......
编辑:我正在使用gcc
编译器。
我正在尝试在 C 中初始化数组和字符串的方法,并发现:
char *str = "ABCDE";
完美地初始化字符串,没有错误或警告,但是:
int *array = {1,2,3,4,5};
给我警告并最终转储核心。现在真的让我很烦恼,我想知道为什么这种声明适用于字符但不适用于整数......
编辑:我正在使用gcc
编译器。
通过这样做,它将适用于整数:
int array[] = {1,2,3,4,5};
或这个:
int *array = (int[]){1,2,3,4,5};
"string"
告诉编译器实例化字符串所需的所有信息(大小、类型)(也就是带有 NULL 终止符的字节数组)。除非您将其声明为复合文字,否则裸露{}
不会。添加告诉编译器启动的数据是一个整数数组。ints[]
正如 Nathan 在评论中指出的,这两种说法存在细微差别。
第一个,在堆栈上定义一个由 5 个整数组成的数组。该数组可以修改并一直存在到函数结束。
第二个,1) 在堆栈上定义一个由五个整数组成的匿名数组 2) 定义一个指针“数组”,指向堆栈上匿名数组的第一个元素。由于内存在堆栈上,因此不应返回指针。此外,数组本身并不像字符串文字那样是 const 的。
编辑:如评论员所指出的那样,用复合文字替换了演员表。
字符串文字衰减为指向 char 的 const 指针。而这是 C 中的数组 {1,2,3,4,5} 并且不会衰减。因此,您必须使用 C 中创建数组的语法,如下所示:
int a[] = {1,2,3,4,5} ;
然后你可以指向它:
int a[] = {1,2,3,4,5} ;
int *p = a;
因为数组的名字就是数组的地址或者第一个元素。希望有帮助。