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

0 c memory-management realloc dynamic-memory-allocation

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

char* str = (char*)malloc(sizeof("Hello"));
Run Code Online (Sandbox Code Playgroud)

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

str = "Hello";
Run Code Online (Sandbox Code Playgroud)

所以,内存位置现已满,有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.
Run Code Online (Sandbox Code Playgroud)

所以我假设它将返回一个void*新的,现在更大的内存位置,我现在可以用我的新字符串填充,所以继续使用相同的逻辑malloc():

str = (char*)realloc(str, sizeof("Hello World"));
Run Code Online (Sandbox Code Playgroud)

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

*** Error in `./a.out': realloc(): invalid pointer: 0x0000000000400664 ***
Run Code Online (Sandbox Code Playgroud)

在valgrind

Invalid free() / delete / delete[] / realloc()
Run Code Online (Sandbox Code Playgroud)

这表明指针有问题,str.所以我决定删除:

str = "Hello";
Run Code Online (Sandbox Code Playgroud)

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

char* str = (char*)malloc(sizeof("Hello"));
str = (char*)realloc(str, sizeof("Hello World"));
Run Code Online (Sandbox Code Playgroud)

我知道指针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.
Run Code Online (Sandbox Code Playgroud)

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

abe*_*nky 5

在C中你不能像你试图那样复制内存块:

str = "Hello";
Run Code Online (Sandbox Code Playgroud)

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

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

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

strcpy(str, "Hello");
Run Code Online (Sandbox Code Playgroud)