C 字符串赋值给出段错误

标签 c c-strings

<分区>

我是 C 的新手,我想执行此任务:声明并初始化一个字符串,然后将每个字符串元素重新分配给一个新值。

这样写代码:

char *str = "geeksforgeeks\0";

for (int i = 0; str[i] != '\0'; ++i) {
    str[i] = 'a';
}

抛出段错误。

但是如果我这样写代码:

char string[] = "geeksforgeeks\0";
char *str = string;

for (int i = 0; str[i] != '\0'; ++i) {
    str[i] = 'a';
}

程序运行正常。

还有这段代码:

char str[] = "geeksforgeeks\0";

for (int i = 0; str[i] != '\0'; ++i) {
    str[i] = 'a';
}

行为正确。

两者有什么区别?不应该是等价的吗?

最佳答案

char *str = "geeksforgeeks\0";

此字符串分配在只读*内存中,您无法修改它。还有空终止符是多余的。

与您定义的数组不同,这就是它起作用的原因。在数组的情况下,字符串文字被复制到数组所在的内存中 - 您可以修改该数组的内容。所以用这个

char *str = string;

您指向数组的第一个元素 - 如前所述,它是可修改的(以及数组的所有元素)。

*它们可能不是存储在只读存储器中,具体取决于平台。但是无论如何你都不允许修改它们。

关于C 字符串赋值给出段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34028580/

相关文章:

c - 在查询中填充/插入值

`stdin` 、 `stdout` 和 `stderr` 的值可以假设为常数吗?

c - 为什么调用这个函数没有效果?

c++ - 无法通过单词/或 12 个字符打印字符串

python - Gstreamer 在 PLAYING 状态下更改源

仅将 C 中 printf 中的第一个更改为第二个

c - 在 C 中返回指针

使用 %s 时无法访问数组的第一个下标,但可以使用 %c

c - C 中 strncpy 的总线错误

c - 为什么我在这段代码中遇到段错误?