我写了一个小函数来改变字符串。
当我使用这个功能时,有时我会收到一个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
的情况是有效的,因为它指向允许您更改的动态分配内存。