C:strncpy导致指针出现问题

C:strncpy导致指针出现问题,c,pointers,strncpy,C,Pointers,Strncpy,可能重复: 我想替换字符串中的一个单词。这是密码 char text[] = "This is a list of lists"; char *find = "list"; char* pos = NULL; pos = strstr(text,find); strncpy(pos,"test",4) 这很好,但是 char *text = "This is a list of lists"; char *find = "list"; char* pos = NULL; pos = strs

可能重复:

我想替换字符串中的一个单词。这是密码

char text[] = "This is a list of lists";
char *find = "list";
char* pos = NULL;
pos = strstr(text,find);
strncpy(pos,"test",4)
这很好,但是

char *text = "This is a list of lists";
char *find = "list";
char* pos = NULL;
pos = strstr(text,find);
strncpy(pos,"test",4)
这会导致分段错误


在第一个示例中,“text”是一个数组,数据只是在该位置复制的。第二个“文本”是指针。问题是什么?

问题是第二个示例中的字符串是字符串文字,必须保持不变。当您尝试写入该字符串时,您正在写入只读内存,这(取决于操作系统)是不允许的。

问题是第二个示例中的字符串是字符串文字,必须保持不变。当您尝试写入该字符串时,您正在写入只读内存,这(取决于操作系统)是不允许的。

char text[] = "This is a list of lists"; // 1


即,在(1)中,
文本
是一个非常量字符数组;其中,如(2)所示,
文本
指向字符串文本,字符串文本是常量。您不能修改常量对象,这是您在(2)中尝试的。你在(2)中所做的实际上是未定义的行为

char text[] = "This is a list of lists"; // 1


即,在(1)中,
文本
是一个非常量字符数组;其中,如(2)所示,
文本
指向字符串文本,字符串文本是常量。您不能修改常量对象,这是您在(2)中尝试的。你在(2)中所做的实际上是未定义的行为。

AHHH!您正在修改字符串文字。去掩护!请稍候,我正在查找复制。字符串文字仍在我的内存中。如果我无法更改它,请阅读我链接的复制。它有一个非常清楚的解释。基本上,并不是所有的内存都是可修改的。啊,是的,每日的“为什么当我修改一个字符串文字时我的程序会崩溃”问题。今天比昨天来得早。啊!您正在修改字符串文字。去掩护!请稍候,我正在查找复制。字符串文字仍在我的内存中。如果我无法更改它,请阅读我链接的复制。它有一个非常清楚的解释。基本上,并不是所有的内存都是可修改的。啊,是的,每日的“为什么当我修改一个字符串文字时我的程序会崩溃”问题。它今天比昨天来得早。C允许以某种方式更改文本吗?@MPJ:我认为C标准不允许。文字应该是常量,不应该修改它。但是您的编译器可能有一些允许它的标志。我看不出有任何理由需要修改常量对象。你可以
strcpy
将任何字符串文本复制到一个字符数组中,然后根据你的意愿修改数组。C允许以某种方式更改文本吗?@MPJ:我认为C标准不允许这样做。文字应该是常量,不应该修改它。但是您的编译器可能有一些允许它的标志。我看不出有任何理由需要修改常量对象。您可以
strcpy
将任何字符串文本复制到字符数组,然后根据需要修改数组。