变量点等于数组中的元素

时间:2017-03-02 01:55:09

标签: c arrays pointers

#include <stdio.h>

int main() {

    char x[] = "hello";
    char *y = "world";
    *y = x[1];
    printf("%s", y);

return 0;
}

有人可以帮我理解为什么这段代码不能编译?

4 个答案:

答案 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;
}