分段故障SIGSEGV依赖于初始化方法

时间:2017-06-13 16:29:58

标签: c segmentation-fault sigsegv

我写了一个改变字符串的小函数foo

当我使用该功能时,有时会收到SIGSEGV故障。这取决于字符串的初始化方式。在调用函数main中,通过内存分配初始化字符串并调用strcpy。我可以正确更改该字符串。

当我声明变量时,另一个字符串(TestString2)被初始化。我无法修剪此字符串,但得到了SIGSEGV错误。

为什么会这样?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



void foo(char *Expr)
{
    *Expr = 'a';
}



int main()
{
    char  *TestString1;
    char  *TestString2 = "test   ";

    TestString1 = malloc (sizeof(char) * 100);
    strcpy(TestString1, "test   ");

    foo(TestString1);
    foo(TestString2);

    return 0;
}

1 个答案:

答案 0 :(得分:6)

TestString2的情况下,将其设置为字符串常量的地址。这些常量不能修改,通常驻留在内存的只读部分。因此,您调用undefined behavior,在这种情况下表现为崩溃。

TestString1的情况有效,因为它指向允许更改的动态分配的内存。