【发布时间】:2016-12-29 00:29:47
【问题描述】:
char s[] = "abc";
char t[3] = "abc";
实际上等同于:
char s[] = { 'a', 'b', 'c', '\0' };
char t[] = { 'a', 'b', 'c' };
还有以下内容:
char *word = "abc";
word[0] = 'd';
将word放在只读内存中,导致非法内存操作word[0] = 'd'出错。
这只是chars 的情况吗?当我做这样的事情时,我不会得到错误:
int array[] = {1, 2, 3};
int *p = array;
p[0] = 0; // No error here
array[1] = 1; // or here
【问题讨论】:
-
是的,这些行为特定于字符数组和字符串文字。阅读 C 标准以获取完整的详细信息。
-
真诚地,我不知道他们为什么对您的问题投反对票。
-
在你的第一段代码中,
t[3] = "abc" should bechar t[3] = "abc";同样在你的第二块。 -
前两行不彼此相同。并且标准中没有对ROM的要求。运行操作系统的 PC 甚至没有 ROM。也不需要生成运行时错误。目前尚不清楚您的意图或实际问题是什么。 sn-ps 甚至没有可比性,并且缺少信息。
-
注意
word本身就是一个可修改的变量;它可以被分配一个新的指针值。当您使用char *word = "abc";时,您将其指向一个字符文字,该文字被视为一个字符数组。尝试修改字符串文字会导致未定义的行为。字符串不必在只读内存中(尽管现在通常是这样)。将"abc"修改为"dbc"的尝试可能会成功,并且可能同时将字符串文字"xyzabc"修改为"xyzdbc"— 否则可能会失败并导致程序崩溃。你应该使用const char *word = "abc";。