分割错误
我在这里看到了许多关于在C程序中获得分段错误的问题,并且我认为能够参考这里的那些将是一件好事,这是一些导致分段错误的案例。 我的答案张贴在下面。
正如在一些答案中所写的,对于所有情况,行为都是不确定的,尽管许多人认为它们是分段错误 ,所以这个问题是关于导致这种“症状”的原因。
在下面的案例中,当我运行该程序时出现分段错误,您能确定原因吗?
1)
char *str = "foo";
str[0] = 'b'; // << Segfault hre
2)
char str[] = "foo";
char *newStr = malloc(strlen(str));
strcpy(newStr, str);
free(newStr); // << Segfault here
3)
char *str = malloc(4 * sizeof(char));
str = "foo";
free(str); // << Segfault here
4)
char *str = malloc(4 * sizeof(char));
strcpy(str, "foo");
free(str);
if (str != NULL)
free(str); // << Segfault here
5)
char *str = "something and then foo";
printf("%s", str[19]); // << Segfault here
6)
typedef struct {
char *str;
}st;
...
st *s;
s = malloc(sizeof(st));
s->str = malloc(5);
free(s);
free(s->str); // << Segfault here
你所有的例子都会导致未定义的行为,这可能会导致崩溃(或者它可能看起来没有任何伤害)。
您不允许更改字符串文字。 (见这里)
您忘记为终止nul字节分配存储空间,请执行malloc(strlen(str) + 1);
你使用malloc(或类似函数)没有获得的指针调用free()。 当你让str
指针指向一个字符串文字时,你已经失去了指向malloc和泄漏内存的指针。
你在同一个指针上调用free()两次,这是未定义的行为。
%s在printf格式字符串中告诉printf参数是一个字符串(一个char *指向一系列nul结尾的字符)你传递给它一个字符而不是字符串。 如果要打印字符串的后缀use printf("%s", &str[19]);
你传递一个无效的指针释放(),你已经free'd s
,你不能解引用后,当你做s->str
。 反转释放顺序: free(s->str); free(s);
free(s->str); free(s);
情况1:
char *str = "foo";
在只读的文本段中分配一个字符串的地址,并且不能像第二行那样写入它: str[0] = 'b';
。 如果你想修改文本,使用char str[] = "foo";
这将在栈上创建一个字符数组并将其指针指定给str。
情况2:
strlen
返回字符串的末尾没有'