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)
未定义的行为.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.
另外,在使用时[由OP更新的代码片段]realloc(),请注意第二个参数.它应该是新的大小[总计],而不是与当前分配大小的差异.
同样,您必须使用返回值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)
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |