Мне нужно реализовать простой динамический массив указателей для указателя typedef'ed.
Использование realloc каждый раз, когда пользователь запрашивает его, размер массива будет увеличиваться на sizeof (указатель).
Так что у меня есть это:Нужно ли инициализировать (установить в 0) память после вызова realloc?
#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)
Я обеспокоен 3 элемента, и его содержание.
Вот почему я спрашиваю, должен ли я установить 0 память после нового realloc.
Edit:
Таким образом, как указано в стандарте С, по Н2СО3, новый вызов перераспределить, является:
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()' будет копировать все, что первоначально было в буфере. Если новый блок больше исходного, то элементы в конце (то есть те, которые отсутствовали в исходном массиве) будут неинициализированы. –
@ H2CO3: Новый блок, безусловно, больше, чем старый, поэтому все предыдущие данные потеряны? – Chris
Naw. Читайте мой комментарий еще раз. Элементы excess будут неинициализированы, исходное содержимое в начале блока памяти будет сохранено. –