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,这种情况再也不会发生了,我会执行的。谢谢