C 分段故障SIGSEGV取决于初始化方法

C 分段故障SIGSEGV取决于初始化方法,c,segmentation-fault,C,Segmentation Fault,我编写了一个小函数foo,用于更改字符串 当我使用该功能时,有时会收到SIGSEGV故障。这取决于字符串的初始化方式。在调用函数main中,通过内存分配和调用strcpy初始化字符串。我可以正确地更改该字符串 另一个字符串(TestString2)在我声明变量时初始化。我不能修剪这根线,但得到了SIGSEGV故障 为什么会这样 #include <stdio.h> #include <stdlib.h> #include <string.h> void

我编写了一个小函数
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;
}
#包括
#包括
#包括
void foo(char*Expr)
{
*Expr='a';
}
int main()
{
char*TestString1;
char*TestString2=“测试”;
TestString1=malloc(sizeof(char)*100);
strcpy(TestString1,“测试”);
foo(TestString1);
foo(TestString2);
返回0;
}

TestString2
的情况下,将其设置为字符串常量的地址。这些常量不能修改,通常位于内存的只读部分。因此,您调用了在本例中显示为崩溃的


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

C没有字符串类型。指针不是数组@xing,Re“TestString2指向字符串文字”,不,它指向字符串。字符串是表示字符串的源代码。