【发布时间】:2013-10-02 09:33:26
【问题描述】:
realloc函数(c),它只占用内存的new部分的长度,如何复制old(更小,强制出现问题的情况) 部分内存到新 一个? (这是假设它需要,例如,找不到与 old 块相邻的内存来扩展它)
如果它从较小的部分复制完整大小(第二个 arg 到 realloc),它会从无效内存中读取,对吗?
谢谢, J
编辑:说明一个极端示例的代码:
int main ( void ) {
unsigned int i=0;
void *test_ptr1, *test_ptr2;
// this first bit just finds the size of the available heap, ignore it if you wish
do {
free(test_ptr1);
printf("%u\n",i);
i+=1073741824; // 1GiB
} while ((test_ptr1 = malloc(i)));
i-=1073741824;
do {
free(test_ptr1);
printf("%u\n",i);
i+=1048576; // 1MiB
} while ((test_ptr1 = malloc(i)));
i-=1048576;
do {
free(test_ptr1);
printf("%u\n",i);
i+=1024; // 1KiB
} while ((test_ptr1 = malloc(i)));
i-=1024;
do {
free(test_ptr1);
printf("%u\n",i);
i+=128; // 128B
} while ((test_ptr1 = malloc(i)));
i-=128;
do {
free(test_ptr1);
printf("%u\n",i);
i++; // 1B
} while ((test_ptr1 = malloc(i)));
i--;
// i is now equal to the size of the available heap (I think...)
test_ptr1 = calloc(i-1, 1); // calloc all but one byte of the available heap
test_ptr2 = malloc(1); // malloc the reamining byte
printf("proving calloc: %u\n", ((char *)test_ptr1)[i-2]); // outputs 0, this might be a point of weakness int this program, if this is optimised in any way it fails to demonstrate the effect
*(char *)test_ptr2 = 'c'; // initialise the byte to 'c'
free(test_ptr1); // free the vast majority of the heap
if ((test_ptr1 = realloc(test_ptr2, i-1))) { // realloc the one byte to the space taken up by the previous calloc that was freed in the previous line
printf("realloc success: %c\n", *(char *)test_ptr1); // outputs c, but whats in the rest of this memory section? and more informatively, where was it coppied from?
getc(stdin);
free(test_ptr1);
free(test_ptr2);
return 0;
} else {
printf("realloc failed\n");
free(test_ptr2);
return -1;
}
}
输出:
1945305043
1945305044
1945305045
1945305046
1945305047
1945305048
1945305049
1945305050
1945305051
1945305052
1945305053
1945305054
1945305055
1945305056
proving calloc: 0
realloc success: c
【问题讨论】:
-
如果还有其他人想知道这个问题的答案,您可能会对这个链接感兴趣:bytes.com/topic/c/answers/600170-implementing-realloc 它非常有用,但是阅读全文 b/c 有一些不好的信息在前几篇文章中。
标签: memory memory-management memcpy realloc