分割错误

我在这里看到了许多关于在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返回字符串的末尾没有''字符的长度,因此strlen("foo") = 3 ,而strcpy复制包含''字符的字符串,因此它复制比您分配的字节更多的字节。

    情况3:
    如情况1那样, str = "foo";str指定地址“foo”,这意味着你丢失了分配的内存地址, str现在包含一个指向文本段的指针,由于它不在堆上,所以你不能free它,它是只读的记忆。

    案例4:
    free函数不会将NULL指定为参数所接收的指针(因为它没有它的地址,它不能这样做)。 并且您正试图在已经free的缓冲区上free调用d。

    情况5:
    str[19]char ,不是char指针, "%s"需要字符串,意思是char * 。 作为许多平台上的地址对待,此char是非法地址。 printf()不检查收到的参数。

    情况6:
    的使用s->strsfree d是错误的。 正确的用法是首先调用free(s->str); 然后free(s);拨打free(s); 。 释放内部分配的内存,然后free其容器。


  • 未定义行为 :尝试更改字符串文字
  • 未定义的行为 :写入数组的末尾
  • 未定义的Bahaviour :传递给free()一个没有通过malloc()获得的指针
  • 未定义的行为 :传递给free()一个无效的指针
  • 未定义的行为printf()格式说明符与实际参数类型之间的不兼容性
  • 未定义的行为 :传递给free()一个无效的指针
  • 未定义的行为可以通过“分段错误”表现出来,但这绝不是必需的结果。 任何事情都可能发生:)

    链接地址: http://www.djcxy.com/p/43889.html

    上一篇: Getting Segmentation Fault

    下一篇: C code with undefined results, compiler generates invalid code (with