c - 分段故障 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;
}

TestString2 的情况下,您可以将其设置为字符串常量的地址。 这些常量无法修改,通常驻留在内存的只读部分中。 因此,您调用未定义的行为,在本例中表现为崩溃。

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

最新更新