在C中初始化字符串和数组 - 区别

Map*_*uto 4 c

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

char *str = "ABCDE";
Run Code Online (Sandbox Code Playgroud)

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

int *array = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*mes 7

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

int array[] = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

或这个:

int *array = (int[]){1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

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

正如内森在评论中指出的那样,这两种说法存在细微差别.

第一个,在堆栈上定义一个5个int的数组.此数组可以修改并一直运行到函数结束.

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

编辑:用评论员指出的复合文字取代了演员阵容.

  • 只是想添加这两个语句是不同的,第一个在堆栈中创建一个数组,并将数组复制到其中,第二个声明堆栈中的指针,并设置值为文字数组.因此,第二个真的是const int*array =(int [])... (2认同)