我写了一个小函数来改变字符串。
当我使用这个功能时,有时我会收到一个sigsegv错误。这取决于字符串的初始化方式。在调用函数foo中,通过内存分配和调用main初始化字符串。我能正确地改变那根线。
另一个字符串(strcpy)在我声明变量时初始化。我不能修剪这个字符串,但得到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的情况下,将其设置为字符串常量的地址。这些常量不能修改,通常位于内存的只读部分。因此,调用undefined behavior在本例中显示为崩溃。
TestString1的情况是有效的,因为它指向允许您更改的动态分配内存。

08-19 13:24