[英]Why can't I declare and define a char-pointer variable to point to a char-array?
在下面的代碼中初始化s2
有什么問題?
#include <stdio.h>
int main()
{
char *s1 = "foo";
char *s2 = {'f', 'o', 'o', '\0'};
printf("%c\n", s1[1]);
printf("%c\n", s2[1]);
return 0;
}
我想,因為我可以像上面那樣初始化s1
, s2
的初始化也應該正常工作。
但是這段代碼會導致編譯時警告以及運行時分段錯誤。
$ gcc foo.c
foo.c: In function ‘main’:
foo.c:6: warning: initialization makes pointer from integer without a cast
foo.c:6: warning: excess elements in scalar initializer
foo.c:6: warning: (near initialization for ‘s2’)
foo.c:6: warning: excess elements in scalar initializer
foo.c:6: warning: (near initialization for ‘s2’)
foo.c:6: warning: excess elements in scalar initializer
foo.c:6: warning: (near initialization for ‘s2’)
$ ./a.out
o
Segmentation fault (core dumped)
是的,因為{'f', 'o', 'o', '\\0'};
是一個括號封閉的初始化列表。 它不能以任何方式用於初始化指針變量 。 但是,它可以用於初始化char
數組,例如
char s2[] = {'f', 'o', 'o', '\0'};
因為數組不是指針 。
對於您的情況,您可以嘗試使用復合文字作為變通方法。
就像是
char *s2 = (char []){'f', 'o', 'o', '\0'};
只是添加一些額外的信息,這些信息可能在讀完這個答案后出現,就像為什么/如何用字符串文字初始化一個數組,比如
char s3[] = "Hello";
是可能的,因為如C11
第6章第9.7節所述, 初始化
字符類型數組可以由字符串文字或UTF-8字符串文字初始化,可選地用大括號括起來。 字符串文字的連續字節(如果有空間或數組大小未知,則包括終止空字符)初始化數組的元素。
一個更好的問題是為什么你可以初始化一個帶有字符串文字的指針,因為無法使用數組初始化程序初始化指針應該不足為奇:畢竟,數組不是指針。
但是,字符串文字是特殊的。 C允許您使用它們來初始化數組和指針,以便為創建以null結尾的字符串提供方便的語法。 這就是為什么你的第一個語法適用於字符數組和字符指針。
指定的初始值設定項 {}
初始化=
左側的數據。 例如
int a[6] = { 0, 0, 15, 0, 29, 0 };
初始化6個整數的數組,這就是初始化列表中每個元素都是整數的原因。
在你的例子中
char *s2 = {'f', 'o', 'o', '\0'};
因此,您將嘗試使用不是您想要的整數字符值初始化指向char的指針。 要初始化字符數組,您可以使用
char s2[] = {'f', 'o', 'o', '\0'};
語法,或
char s2[] = "foo"; /* also allowed in C, as dasblinkenlight noted - the better
* question would be why this works and Sourav Ghosh gave
* the answer */
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.