Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何避免分段错误?_C_Segmentation Fault - Fatal编程技术网

C 如何避免分段错误?

C 如何避免分段错误?,c,segmentation-fault,C,Segmentation Fault,代码是不言自明的,但它给了我分段错误,为什么\ #include <stdio.h> int main(void) { char *c = "Hella"; *(c+4) = 'o'; printf("%s\n",c); } #包括 内部主(空) { char*c=“Hella”; *(c+4)=“o”; printf(“%s\n”,c); } 如何避免它? 不要修改字符串文字 char *c = "Hella"; 声明指向存储在实现定义的只读内存中的字

代码是不言自明的,但它给了我分段错误,为什么\

#include <stdio.h>
int main(void)
{
    char *c = "Hella";
    *(c+4) = 'o';
    printf("%s\n",c);
}
#包括
内部主(空)
{
char*c=“Hella”;
*(c+4)=“o”;
printf(“%s\n”,c);
}
如何避免它?

不要修改字符串文字

char *c = "Hella";
声明指向存储在实现定义的只读内存中的字符串文字“Hella”的指针。
不允许修改此文字。尝试这样做会导致未定义的行为

幸运的是,您的程序崩溃了,未定义的行为并不总是导致崩溃,但可能会导致您的程序以任何可能的方式异常运行

这里需要的是一个数组:

char c[] = "Hella";
读得好:

创建
c
的方式指向字符串文本。您不能修改它的内容。如果您希望能够做到这一点,请使用:

char c[6] = "Hella";
c[4] = o;

或者使用动态分配的字符数组。

您试图覆盖文本。实际上,您的代码应该是:

const char *c = "Hella";
这可以解释发生了什么

要覆盖您自己的内存,请执行以下操作:

char c[] = "Hella";

更安全。

您不能修改代码中定义的字符串。如果要修改它们,请使用strdup

#include <stdio.h>
int main(void)
{
    char *c = strdup("Hella");
    *(c+4) = 'o';
    printf("%s\n",c);
    free(c);
}
#包括
内部主(空)
{
char*c=strdup(“Hella”);
*(c+4)=“o”;
printf(“%s\n”,c);
免费(c);
}

将字符串放入分配给堆栈的数组中:

char c[] = "Hella";

因为如上所述,字符串文本通常是只读的。

您忘记使用编译器警告,或者忘记注意或理解它们。您可能需要查看@Geoffrey。编辑帖子的意思是不正确的。您只能编辑表单。语言、格式等。您可以在评论中提出更改。是的,更改是正确的,但根据规则,我们应该只对表单使用编辑,而不是对内容使用编辑!杰弗里应该通过评论的方式提出内容变更。哈,真的很抱歉Gangnus,这种情况再也不会发生了,我会执行的。谢谢