我看到很多关于出现分段错误在SO中的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
您的所有示例都会导致未定义的行为,这可能会导致崩溃(或者它可能看起来根本不会造成任何损害)。
不允许您更改字符串文字。 (参见例如here https://stackoverflow.com/questions/164194/why-does-simple-c-code-receive-segmentation-fault)
您忘记为终止 nul 字节分配存储空间,请这样做malloc(strlen(str) + 1);
您正在对不是从 malloc (或类似函数)获取的指针调用 free() 。当你制作str
指针指向字符串文字,您也丢失了指向使用 malloc 分配的内存的指针,并且此处也泄漏了内存。
您在同一指针上调用 free() 两次,这是未定义的行为。
printf 格式字符串中的 %s 告诉 printf 该参数是一个字符串(一个 char * 指向以 nul 结尾的字符序列),您向其传递的是一个 char,而不是一个字符串。如果你想打印字符串的后缀,请使用printf("%s", &str[19]);
您正在向 free() 传递无效的指针,您已经释放了s
,以后您不能取消引用它s->str
。反转释放的顺序:free(s->str); free(s);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)