下面的代码是什么意思?我以为是编译错误。但不会发生编译错误。
int main()
{
const int a=1;
printf("%c", ++a["Gyantonic"]);
}
Linux a 中的输出是分段错误。a[1]
如果代替.它会给出编译错误++a["Gyantonic"]
。
它是如何工作的?
下面的代码是什么意思?我以为是编译错误。但不会发生编译错误。
int main()
{
const int a=1;
printf("%c", ++a["Gyantonic"]);
}
Linux a 中的输出是分段错误。a[1]
如果代替.它会给出编译错误++a["Gyantonic"]
。
它是如何工作的?
++a["Gyantonic"]
相当于:
++(a["Gyantonic"])
这相当于
++("Gyantonic"[a])
相当于
++("Gyantonic"[1])
"Gyantonic"[1]
产生'y'
并++
递增'y'
存储在字符串文字中并产生结果。但是"Gyantonic"
是字符串文字,字符串文字不能修改。这就是你得到分段错误的原因。
在 C 中,表达式x[y]
完全等于*(x+y)
。由于加法是可交换的,这意味着您也可以将其写为y[x]
,即*(y+x)
相同的东西。
++a["Gyantonic"]
表示您正在尝试增加“Gyantonic”的第一个字符(因此,第一个,不是第一个而是第二个,从 0 开始的 C 字符串)字符。
而且由于“Gyantonic”是一个只读的常量字符串,它的任何字符都不能增加,你会得到一个分段错误。
在启用警告的 gcc 中,您将获得:
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 会出现段错误。