我在尝试用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};
"字符串"
告诉编译器实例化字符串所需的所有信息(大小,类型)(也就是一个带有NULL终止符的字节数组)。裸体的{}
没有这个作用,除非你将其声明为复合文字。添加ints[]
告诉编译器,初始化数据是一个整数数组。
正如Nathan在评论中指出的那样,两种语句有微妙的差别。
第一种,在堆栈上定义了一个包含5个整数的数组。这个数组可以被修改,并且在函数结束之前一直存在。
第二种情况下,1)在堆栈上定义了一个匿名数组,其中包含5个int 2)定义了一个指针“array”,指向堆栈上匿名数组的第一个元素。由于内存在堆栈上,因此不应返回该指针。此外,该数组不像字符串文字那样本质上是const。
编辑:根据评论者的指出,用复合文字替换了强制转换。
"字符串字面量会衰减为一个 const char 指针。 而在 C 语言中,{1,2,3,4,5} 是一个数组,不会衰减。 因此,在 C 语言中需要使用创建数组的语法,例如:
int a[] = {1,2,3,4,5} ;
int a[] = {1,2,3,4,5} ;
int *p = a;
char*
。 - Cat Plus Pluschar *
是完全可以的。未定义的是修改由此指针指向的字符。你的评论很容易被误读为永远不要编写像char *ptr; ... ; ptr = "foo"
这样的语句。 - Jens