C-memmove 的函数原型是void *memmove(char *dest, const char *src, size_t count);当出现重叠时,岂不是改变了const 指针所指的内容?

发布于 2017-06-05 03:05:13 字数 90 浏览 1183 评论 1

dest 和src部分重叠时,而又要把*src赋给*dest,不就是相当于改变了*src,而*src由被定义为const???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清晨说ぺ晚安 2017-09-08 06:59:19

是的,src 指向的内容会被改变。不能通过一个const指针来修改一块内存,不表示const指针指向的内存是不可变的,例如可以通过其他非 const 指针修改。举例:

int main(){
  const int x=1;
  //x=3; //compiler error
  int *y=&x;
  *y=2;
  printf("%dn",x);  // print   2
}

memmove 就是这种情况,他的原型告诉你他只会通过 src 读,不会(也不能)通过src写,而通过dest可以进行读和写。

如果src指向的字符串常量,然后你把src强转成非const的dest(编译器会警告你的),然后通过dest修改那就会Segmentation fault,因为字符串常量是真的不可变的。

更多const细节可以看一下@C语言中的const实现机制

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文