【发布时间】:2014-01-05 20:14:49
【问题描述】:
如果我有一个变量str,我想在堆上分配内存,我会使用malloc(),例如:
char* str = (char*)malloc(sizeof("Hello"));
malloc() 正在返回一个void* 指针,这是我的内存所在的内存位置。
所以现在,我可以给它一些数据
str = "Hello";
所以,内存位置现在已满,有 6 个字节。现在,我想增加它的大小,以包含字符串"Hello World"。所以,我使用realloc()。根据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"));
但是,这就是问题所在。这将导致:
*** Error in `./a.out': realloc(): invalid pointer: 0x0000000000400664 ***
在 valgrind 中
Invalid free() / delete / delete[] / realloc()
这表明指针str 有问题。所以我决定删除:
str = "Hello";
它编译得很好,代码如下:
char* str = (char*)malloc(sizeof("Hello"));
str = (char*)realloc(str, sizeof("Hello World"));
我知道指向realloc() 的指针必须来自malloc(),但简单地为其分配数据不应导致realloc() 失败,这表明我做错了什么。
那么,我做错了什么?
这是失败的代码:
char* str = (char*)malloc(sizeof("Hello"));
str = "Hello";
str = (char*)realloc(str, sizeof("Hello World"));
// str = "Hello World"; - this is what I would to be able to do.
注意:这段代码是我从一个更大的程序中剥离出来的,只是 为了证明我遇到的问题,所以我删除了检查等。 另外,我对 C 语言非常陌生,因此问题非常简单(抱歉?),但是经过数小时的工作和研究,我仍然无法弄清楚我做错了什么 - 它似乎对其他人来说都很好! .
【问题讨论】:
-
不要转换
malloc或realloc的结果;这不是必需的,在某些情况下它可以掩盖错误。 -
@wildplasser:好的,让我们清理过时的 cmets(包括这个)。
标签: c memory-management dynamic-memory-allocation realloc