C:realloc()无法按预期运行

时间:2014-01-05 20:14:49

标签: c memory-management dynamic-memory-allocation realloc

如果我有一个变量str我想在堆上分配内存,我会使用malloc()之类的:

char* str = (char*)malloc(sizeof("Hello"));

malloc()返回一个void*指针,这是我的记忆所在的内存位置。 所以现在,我可以给它一些数据

str = "Hello";

因此,内存位置现已满,有6个字节。现在,我想增加其大小,以包含字符串"Hello World"。所以,我使用realloc()。根据{{​​1}},man将:

void* realloc(void *ptr, size_t size)

所以我假设它将The realloc() function changes the size of the memory block pointed to by ptr to size bytes. The contents will be unchanged in the range from the start of the region up to the minimum of the old and new sizes. If the newsize is larger than the old size, the added memory will not be initialized. 返回到新的,现在更大的内存位置,我现在可以用我的新字符串填充,所以继续使用相同的逻辑void*

malloc()

但是,这就是问题所在。这将导致:

str = (char*)realloc(str, sizeof("Hello World"));

在valgrind

*** Error in `./a.out': realloc(): invalid pointer: 0x0000000000400664 ***

这表明指针Invalid free() / delete / delete[] / realloc() 有问题。所以我决定删除:

str

它编译得很好,使用以下代码:

str = "Hello";

我知道指向char* str = (char*)malloc(sizeof("Hello")); str = (char*)realloc(str, sizeof("Hello World")); 的指针必须来自realloc(),但只是为其分配数据不会导致malloc()失败,这表明我正在做完全错误的东西。

那么,我做错了什么?

这是失败的代码:

realloc()

注意:这段代码是我从一个更大的程序中删除的,只是 为了证明我遇到的问题,所以我已经删除了支票等。 另外,我对C很新,所以非常简单的问题(抱歉?),但经过几个小时的工作和研究,我仍然无法弄清楚我做错了什么 - 似乎对其他人都很好!

6 个答案:

答案 0 :(得分:5)

在C中你无法复制内存块,就像你试图做的那样:

str = "Hello";

有效的字符串副本;相反,它会使你的malloc内存不计入("泄露"),并改变指针' str'指向一个硬编码的字符串。

此外,因为str现在是指向硬编码的静态字符串的指针,所以无法重新分配它。它从来都不是malloc开始的!

要解决此问题,您需要将str = "Hello";更改为:

strcpy(str, "Hello");

答案 1 :(得分:1)

str = "Hello";

是问题所在。您分配了一个缓冲区并使str指向它。然后,您需要复制到该缓冲区。像这样:

strcpy(str, "Hello");

但是你改变了指针的值。

当您致电realloc时,您必须转到realloc,这是一个由之前调用mallocrealloc或类似内容创建的指针。但你没有这样做。因为您修改了str

答案 2 :(得分:1)

  

malloc()返回一个void*指针,这是我记忆所在的内存位置。

到目前为止一切顺利

  

现在,我可以给它一些数据

str = "Hello";

你能够为内存提供一些数据是正确的,但你做错的方法是错的:你不能将指针重新分配给字符串文字 - 这会造成内存泄漏。相反,您应该将数据复制到内存块中,如下所示:

strcpy(str, "Hello");

如果您执行的是赋值而不是副本,则指针不再指向malloc返回的内容,将指针传递给realloc是非法的。

答案 3 :(得分:1)

这条指令:

str = "Hello";

不会在堆中分配任何内存。

答案 4 :(得分:1)

char* str = (char*)malloc(sizeof("Hello"));

您正在为str动态分配内存。 不可即可。您cast - 返回malloc()不好的返回值。

str = "Hello";

您正试图将static字符串"Hello"的地址放在str中。 为什么?这实际上是覆盖 malloc()分配的内存地址。 str包含的内容现在不是动态分配的指针。这是静态地址,不符合realloc() / free()的条件。此外,您正在进入内存泄漏区域。我认为你需要strcpy()

答案 5 :(得分:0)

如果要避免重新分配内存问题,请使用strdup函数:

char *str = strdup("hello");
str = strdup("hello word");

strdup 返回指向包含复制字符串的存储空间的指针。如果无法保留存储strdup则返回NULL。