4

我正在尝试在 C 中初始化数组和字符串的方法,并发现:

char *str = "ABCDE";

完美地初始化字符串,没有错误或警告,但是:

int *array = {1,2,3,4,5};

给我警告并最终转储核心。现在真的让我很烦恼,我想知道为什么这种声明适用于字符但不适用于整数......

编辑:我正在使用gcc编译器。

4

2 回答 2

7

通过这样做,它将适用于整数:

int array[] = {1,2,3,4,5};

或这个:

int *array = (int[]){1,2,3,4,5};

"string"告诉编译器实例化字符串所需的所有信息(大小、类型)(也就是带有 NULL 终止符的字节数组)。除非您将其声明为复合文字,否则裸露{}不会。添加告诉编译器启动的数据是一个整数数组。ints[]

正如 Nathan 在评论中指出的,这两种说法存在细微差别。

第一个,在堆栈上定义一个由 5 个整数组成的数组。该数组可以修改并一直存在到函数结束。

第二个,1) 在堆栈上定义一个由五个整数组成的匿名数组 2) 定义一个指针“数组”,指向堆栈上匿名数组的第一个元素。由于内存在堆栈上,因此不应返回指针。此外,数组本身并不像字符串文字那样是 const 的。

编辑:如评论员所指出的那样,用复合文字替换了演员表。

于 2012-09-22T18:55:34.007 回答
4

字符串文字衰减为指向 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;

因为数组的名字就是数组的地址或者第一个元素。希望有帮助。

于 2012-09-22T18:55:39.447 回答