我需要實現一個簡單的指向一個typedef指針的動態指針數組。
每次用戶請求時使用realloc,數組的大小將按sizeof(指針)增長。
所以我有是這樣的:在調用realloc之後,是否需要初始化(設置爲0)內存?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef void* node;
void printmem(node* a, int c) {
int i;
for (i = 0; i < c; ++i)
{
printf("%d\t\t%p\n", i, a[i]);
}
}
int main(void) {
node* nodes = NULL;
int i = 0, count = 20;
for (i = 0; i < count; ++i)
{
nodes = realloc(nodes, sizeof(node));
}
printf("Done reallocating\n");
printmem(nodes, i);
// free(a);
return 0;
}
這給出了以下的輸出:
Done reallocating
0 (nil)
1 (nil)
2 (nil)
3 0x20fe1
4 (nil)
5 (nil)
6 (nil)
7 (nil)
8 (nil)
9 (nil)
10 (nil)
11 (nil)
12 (nil)
13 (nil)
14 (nil)
15 (nil)
16 (nil)
17 (nil)
18 (nil)
19 (nil)
我所關心的第三元素,其含量。
這就是爲什麼我問是否應該在新的realloc後設置爲0的內存。
編輯:
所以,指出C的標準,由H2CO3,新的呼叫到realloc的,就是:
nodes = realloc(nodes, (i+1)*sizeof(node));
而在這之後的initiallization,我這樣做: nodes[i] = NULL
這也工作得很好。
EDIT2:
我現在有這樣的:
int main(void) {
node* nodes = NULL;
int i = 0, count = 20;
for (i = 0; i < count; ++i)
{
nodes = realloc(nodes, (i+1)*sizeof(node));
nodes[i] = NULL;
if (i == 1) {
nodes[i] = &count;
}
}
printf("Done reallocating\n");
printmem(nodes, i);
printf("\t*nodes[1] == %d\n", *(int*)nodes[1]);
printf("\tAddress of count is %p\n", &count);
// free(a);
return 0;
}
'realloc()'將複製原先在緩衝區中的內容。如果新塊大於原始塊,則末尾的元素(即原始數組中未存在的元素)將被初始化。 – 2014-01-11 20:05:16
@ H2CO3:新塊肯定比舊塊大,所有以前的數據都丟失了? – Chris
Naw。再次閱讀我的評論。多餘的元素將被初始化,保存內存塊開始處的原始內容。 – 2014-01-11 20:16:40