3

下面的代码是什么意思?我以为是编译错误。但不会发生编译错误。

int main() 
{ 
    const int a=1; 
    printf("%c", ++a["Gyantonic"]); 
}

Linux a 中的输出是分段错误。a[1]如果代替.它会给出编译错误++a["Gyantonic"]

它是如何工作的?

4

3 回答 3

7
 ++a["Gyantonic"]

相当于:

++(a["Gyantonic"])

这相当于

++("Gyantonic"[a])

相当于

++("Gyantonic"[1])

"Gyantonic"[1]产生'y'++递增'y'存储在字符串文字中并产生结果。但是"Gyantonic"是字符串文字,字符串文字不能修改。这就是你得到分段错误的原因。

于 2012-07-15T14:16:42.620 回答
1

在 C 中,表达式x[y]完全等于*(x+y)。由于加法是可交换的,这意味着您也可以将其写为y[x],即*(y+x)相同的东西。

于 2012-07-15T14:12:01.320 回答
1
++a["Gyantonic"]

表示您正在尝试增加“Gyantonic”的第一个字符(因此,第一个,不是第一个而是第二个,从 0 开始的 C 字符串)字符。

而且由于“Gyantonic”是一个只读的常量字符串,它的任何字符都不能增加,你会得到一个分段错误。

在启用警告的 g​​cc 中,您将获得:

 warning: increment of read-only location ‘"Gyantonic"[a]’ [enabled by default]

预期的输出显然是“z”(Gyantonic 中的“y”加 1)。为此,您应该编写:

    char string[] = "Gyantonic";
    const int a=1;
    printf("%c", ++a[string]);

请注意,这与写作不同

    char *string = "Gyantonic";

第一个版本创建一个数组并在这个可写数组中初始化(COPIES)现有的只读字符串“Gyantonic”。第二个版本创建一个指针,一个指向现有只读字符串“Gyantonic”的标签。

允许写入可写副本 string[];写入 *string 指向的 readonly 会出现段错误。

于 2012-07-15T14:16:02.060 回答