【问题标题】:Why am I getting this error and how to fix it: munmap_chunk(): invalid pointer: 0x0000000000400694 *** Hello WorldAborted为什么我会收到此错误以及如何解决它: munmap_chunk(): invalid pointer: 0x0000000000400694 *** Hello WorldAborted
【发布时间】:2017-07-16 05:14:02
【问题描述】:

我写了以下程序:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        char *s;
        s = (char*)malloc(15);
        s = "Hello World";
        printf("%s",s);
        free(s);
        return 0;
  }

没有编译错误。 我收到此运行时错误: * `./s' 中的错误:munmap_chunk():无效指针:0x0000000000400694 * 你好世界中止

为什么会出现此运行时错误,我该如何解决? 是不是因为在调用malloc之后,s收到了某个地址,赋值s = "Hello World"修改了s的地址,但是后来在做free(s)的时候,指向free的指针不是malloc返回的那个吗?

【问题讨论】:

标签: c string dynamic-memory-allocation


【解决方案1】:

是不是因为调用malloc之后,s收到了某个地址, 并且赋值 s = "Hello World" 修改了 s 的地址,但是 那么在执行 free(s) 时,发送到 free 的指针不是 一个由 malloc 返回的?

是的

    s = (char*)malloc(15);
    s = "Hello World";

你正在覆盖malloc的返回地址(内存泄漏)

free()

如果参数与先前返回的指针不匹配 calloc()、malloc()、posix_memalign()、realloc() 或 strdup() 函数, 或者如果空间已通过调用 free() 或 realloc() 被释放, 行为未定义。

s = "Hello World"; 更改为strcpy(s, "Hello world");

另外,看看Do I cast the result of malloc?

【讨论】:

  • 非常感谢! @Keine 欲望
  • @Keine Lust 实际上,我很困惑....为什么不是 strcpy(&s, "Hello world"); ?我的意思是如果我们发送 s,那么为什么不会复制指针 s?假设我有 int x = 4;然后我将它发送到一个接收 int 的函数中。然后,如果我理解得很好,将在包含 x 的相同内容的不同地址中制作该整数的副本,即 4。因此,如果我将 s 传递给函数,为什么指针 s 的副本会获胜不成?我哪里做错了?谢谢!
  • 不,strcpy 期待指向char 的指针,而s 已经是指向char 的指针(使用运算符&amp;s 的地址会得到指向指针的指针)。
  • @Keine Lust 感谢您的快速回复:) 所以在调用 strcpy(s,"Hello World"); s的地址传给strcpy?
  • @Keine Lust 谢谢,我很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
相关资源
最近更新 更多