内存被淹没

时间:2011-12-26 19:57:13

标签: c memory char

我对这种反应感到困惑。任何人都可以帮我解决这个问题,并指出我犯了错误的地方?键盘输出为“memory clobbered before allocated block

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

int main(void)
{
    char *s = (char *)malloc(10 * sizeof(char));
    s = "heel";
    printf("%s\n",s);
    printf("%c\n",s[2]);
    printf("%p\n",s);
    printf("%d\n",s);
    free(s);
    return 0;
}

4 个答案:

答案 0 :(得分:11)

你试图通过以下方式释放常量记忆:

free(s); // cannot free constant "heel"

您正在做的是分配一块内存并存储其位置(char *s)。然后,您将该引用覆盖为一个字符串常量“heel”(内存泄漏),这不能是free d。为了使其符合要求,您应该将常量字符串复制到您分配的内存中:

strcpy(s, "heel");

以下是获取用户输入的示例:

char *input = malloc(sizeof(char) * 16); // enough space for 15 characters + '\0'
fgets(input, 16, stdin);

// do something with input

free(input);

答案 1 :(得分:1)

char *s = (char *)malloc(10 * sizeof(char));
  s = "heel";

不做您的想法,或者您对更现代语言的期望

第一行为10chars分配一些内存并返回它的地址。

第二行将该地址更改为指向在编译时分配的常量内存块,其中包含“heel”丢失指向已分配内存的链接 - 泄漏它

答案 2 :(得分:1)

你不能free(s) - 它是恒定的记忆。

尝试使用s = "heel";

更改strcpy(s,"heel");

答案 3 :(得分:1)

扩展@TimCooper的回答:

  • 首先执行:char *s = (char *)malloc(10 * sizeof(char));
  • 然后:s = "heel";

第一行分配内存并将该内存的位置分配给s。但第二行将s重新分配给堆栈中常量字符串heel的内存位置!

这意味着您尝试在堆栈上释放()内存,这是非法的。您忘记了内存, AND ,因为您首次分配给s的内容现在无法访问。

如果要将字符串写入s指向的内存中,则应使用strcpy()(或更好,strncpy())之类的内容。