簡體   English   中英

為什么我不能聲明和定義一個char-pointer變量來指向char-array?

[英]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;
}

我想,因為我可以像上面那樣初始化s1s2的初始化也應該正常工作。

但是這段代碼會導致編譯時警告以及運行時分段錯誤。

$ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM