重新分配与其偏移量不同的已分配内存块

Ala*_*ios 2 c memory-management realloc

如果我重新分配以前分配的内存区域的特定内存块会发生什么?


#include <stdlib.h>

int main(void)
{
    char *area = malloc(15 + 1);

    strcpy(area, "Stack / Overflow");
    realloc(area + 5, strlen(area) + 5);

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

area在这个例子中,字符串是否会扩展为5个字节?

Idx: 0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21
Chr: S  t  a  c  k  \0 \0 \0 \0 \0     /       O   v   e   r   f   l   o   w   \0
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 5

未定义的行为.realloc()需要一个返回的指针malloc()或一个或一个或一个NULL.

根据c99第7.20.3.4章第3段,void *realloc(void *ptr, size_t size);[强调我的]

如果ptr是空指针,则realloc函数的行为类似于指定大小的malloc函数.否则,如果ptr与之前由calloc,malloc或realloc函数返回的指针不匹配,或者如果通过调用free或realloc函数释放了空间,则行为未定义.如果无法分配新对象的内存,则不会释放旧对象,并且其值不会更改.


除此之外,在您的代码中

char *area = malloc(15 + 1);
strcpy(area, "Stack / Overflow");
Run Code Online (Sandbox Code Playgroud)

你没有分配空间来终止null.结果可能是毁灭性的.请为存储终止添加空间\0.

另外,在使用时realloc(),请注意第二个参数.它应该是新的大小[总计],而不是当前分配大小的差异.[由OP更新的代码片段]

同样,您必须使用返回值realloc()来访问新分配的内存.旧指针可能不再有效.有关详细信息,请阅读手册页.

所以对你来说,代码应该是这样的

#include <stdlib.h>

int main(void)
{
    char *area = malloc(17);   //space for terminating null
    char * area_next = NULL;


    strcpy(area, "Stack / Overflow");   //cpy 16 chars, with null
    area_next = realloc(area, 23);                  // oldsize + 5

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)