【问题标题】:C:strncpy causing problems with pointer [duplicate]C:strncpy导致指针问题[重复]
【发布时间】:2012-09-14 05:40:29
【问题描述】:

可能重复:
Why do I get a segmentation fault when writing to a string?

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

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)

这会导致分段错误。

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

【问题讨论】:

  • 啊哈!您正在修改字符串文字。前往掩护!等我找到骗子。
  • 字符串文字仍然在我的记忆中。我应该无法更改它吗?
  • 阅读我链接的欺骗。它有一个非常清楚的解释。基本上,并非所有内存都是可修改的。
  • 啊,是的,每天的“为什么我的程序在我修改字符串文字时会崩溃”的问题。今天比昨天来得早。

标签: c pointers strncpy


【解决方案1】:

两者的区别

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

char *text = "This is a list of lists"; // 2

是,在(1)中,text 是一个非常量字符数组;其中与 (2) 中一样,text 指向一个字符串文字,而字符串文字是 constant。您无法修改您在 (2) 中尝试的常量对象。您在 (2) 中所做的实际上是未定义的行为。

【讨论】:

  • C 是否允许以某种方式更改文字?
  • @MPJ:我认为 C 标准不允许这样做。文字应该是不变的,你不应该修改它。但是您的编译器可能有一些允许它的标志。不过,我看不出有任何理由需要修改常量对象。您可以将任何字符串文字 strcpy 转换为字符数组,然后根据需要修改数组。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-07-22
    • 2016-07-01
    • 2012-10-14
    • 2019-03-11
    • 2014-06-26
    • 2019-08-01
    • 1970-01-01
    • 2012-05-14
    相关资源
    最近更新 更多