#include <stdio.h>
int main() {
char x[] = "hello";
char *y = "world";
*y = x[1];
printf("%s", y);
return 0;
}
有人可以帮我理解为什么这段代码不能编译?
答案 0 :(得分:2)
字符串文字在C中是不可变的。任何修改字符串文字的尝试都会导致未定义的行为。
来自C标准(6.4.5字符串文字)
7没有特别说明这些阵列是否与它们不同 元素具有适当的值。 如果程序尝试 修改这样的数组,行为未定义。
您可以使用由sting文字初始化的数组而不是字符串文字本身。例如
char x[] = "hello";
char y[] = "world";
*y = x[1];
考虑到根据C标准函数main,没有参数应声明为
int main( void )
此外,如果您将程序编译为C ++程序,那么编译器也可以为语句发出错误
char *y = "world";
因为在C ++中(与C相反)字符串文字具有常量字符数组的类型。所以在这种情况下,有效声明是
const char *y = "world";
答案 1 :(得分:1)
为什么它在* y = x [1]时崩溃 - 这是我不明白的
崩溃是因为你正试图写一个角色&#39; e&#39;在只读的内存位置。此只读内存位置是指针y
指向的内存位置。
y
如何最终指向read-only
内存位置?
您通过写一行char *y = "world";
来指示它。
这是一个两步过程。首先是一个字符串文字&#34; world&#34;在只读存储区中创建。字符串文字始终在只读存储区中创建。其次,创建指针y
,指向此只读存储器。
解决此问题的原因是什么?
使用数组而不是指针。
而不是
char *y = "world";
使用
char y[] = "world";
为什么它适用于指针?
这是一个3步骤的过程。首先,字符串文字&#34;世界&#34;在只读内存部分中创建。其次,在堆栈中创建一个6字节的新内存。第三,字体&#39;,&#39;&#39;&#39;&#39; l&#39;&#39;&#39; d&#39;&#39;&#39;&#39; 39; \ 0&#39;从包含文字的只读存储器复制到可重写的堆栈上的这个存储器。
答案 2 :(得分:0)
当你写作时:
*y = x[1];
这里由于行char *y = "world"
而给出编译时错误,你可以通过注释这一行来检查它,如果现在你打印y那么你将得到y作为世界。
注意:
中没有错误char *y ; y = & x[1]; // but here y become "ello" as it will read upto a '\0'
对于您想要的任务,您可以写:
char x[] = "hello"
现在,这里y的地址为x [1]。
这里,char x[] = "hello";
char y ;
y = x[1];
printf("%c", y); // y = e
,x是指向字符类型位置的指针,因此它隐含地用作[char x [] =“hello as *(x)=”world“],因此它可以正常工作。 / p>
顺便说一句,如果你只想要y的第二个字符,那么写:
open
答案 3 :(得分:0)
当您尝试写入所谓的常量区域时,您的代码会崩溃,这就是&#34; world&#34;是。你需要做的是这样的事情:
int main() {
char x[] = "hello";
char *y;
y = strdup("world");
*y = x[1];
printf("%s\n", y);
free(y);
return 0;
}