【问题标题】:replacing chars with memmove in char pointer [duplicate]用 char 指针中的 memmove 替换 chars [重复]
【发布时间】:2013-09-22 13:25:13
【问题描述】:

我试图理解为什么会这样:

char myst1r[] = "hello\n";
memmove(myst1r   , myst1r + 1 , 1 );//results in "eello"

而这个:

char *mystr = "hello\n";
memmove(mystr , mystr + 1 , 1 );

导致“访问冲突写入位置”错误。 myst1rmystr 不都指向 char 缓冲区的第一个成员吗?我在这里想念什么?

【问题讨论】:

  • 请解释你为什么投反对票?这是完全有效的 SO 问题。
  • @MichaelV 很多次都是重复的,它被过度询问了。 Downvoters 大概有一种感觉,即您在询问之前没有进行任何研究。此外,任何对数组和指针(尤其是字符串常量)之间的区别了解最少的人都不必问这个问题。
  • 它是与 char 数组一起询问的,这确实很清楚......在我的情况下,我试图处理 char 指针。
  • “请解释你为什么投反对票”,把你的鼠标光标放在向下箭头上,这可能解释了它
  • 请告诉我类似的问题?上面提到的那个不涉及 memmove。但是无论如何......我已经从答案中理解了我需要什么。你们中的一些人太强硬了。即使如果在其他情况下间接回答了这个问题并不意味着这样的问题不能成立。C/C++ 菜鸟也是人。

标签: c++ c string pointers


【解决方案1】:

myst1rchar数组,其中包含其初始化程序的副本mystr 是一个指向char指针,它指向它的初始化器。在这两种情况下,初始值设定项都是文字字符串。区别在于可以修改数组的内容,但不能修改文字字符串的内容。

【讨论】:

  • 那么是不是说我不能用memmove来修改char缓冲区指针呢?
  • 不,不是这个意思。你不能做的是修改字符串文字。字符串文字是带引号的字符串:例如"hello\n"。如果你有一个指向可修改文本的指针,你可以使用memmove
  • 错误代码“写入位置的访问冲突”也很有意义,因为编译器将字符串文字放入只读段中。
  • @AmanDeepGautam - 也许,也许不是。规则是行为未定义。在某些系统上它工作得很好;其他人则不然。
  • @AmanDeepGautam - 投票最多的答案的第一句话是“它的创建位置是编译器编写者的实现决定,真的。”语言定义确实要求将字符串文字放在只读内存中,尽管这很常见。
【解决方案2】:
h e l l o \0
0 1 2 3 4 5

代码

memmove(myst1r, myst1r + 1, 1 )

将位置 1 的字符 (e) 复制到位置 0。结果为 eello

至于第二个例子

char *mystr = "hello\n";

mystr 这里是一个字符串文字,修改它会导致 C 和 C++ 中的未定义行为。

请注意,使用memcpy 替换memmove 将不起作用,因为前两个参数重叠。

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 2018-07-05
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多