我写了一段代码来处理动态数组。想法是使用结构指针数组,其中数组的最后一个成员是NULL。我写的代码的轻微变化如下(使用整数而不是结构)。
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
void list_add(int **list, int* value) {
for(int i = 0; true; i++) {
if(list[i] == NULL) {
list = realloc(list, (i+2) * sizeof(int*));
list[i] = value;
list[i+1] = NULL;
break;
}
}
}
void list_init(int **list) {
int* x;
for(int i = 0; i < 100; i++) {
x = malloc(sizeof(int));
*x = i;
list_add(list, x);
}
}
int main() {
int** l = malloc(sizeof(int*));
l[0] = NULL;
list_init(l);
}
在调试时,我发现只有前3个整数被添加到列表中。我似乎无法弄清楚为什么会发生这种情况。有什么想法吗?
答案 0 :(得分:4)
问题是realloc()
中对list_add()
的调用可能会释放内存块*list
并分配另一个内存块。 list_add
更新其list
指针,但它不会将更新的指针返回给调用者list_init()
; list_init()
的{{1}}指针可能是指向最近释放的内存块的指针。
要修复此代码,list
和list_add()
需要能够“返回”更新的list_init()
指针:
list
答案 1 :(得分:1)
修改强>
在这种动态数组的情况下,你所说的方式不会做得更好,代码只会复杂化。对于每次添加整数,您都使用realloc
积极地尝试节省内存,但执行时需要更多时间。为什么不为数组分配一个内存块并反映动态字符将数组放在带有最后一个索引的结构中,当你添加一些内容时,将它添加到最后一个位置并递增计数器。填充此块时,您可以链接另一个块以指向另一个块。
typedef struct _dyna_arr
{
my_type data_arr[MAX_LEN];
int n;
struct _dyna_arr *next block;
};
因此,您维护多个阵列的链接列表。可以修复MAX_LEN
的大小,这适用于有助于减少内部碎片的应用程序。
* 旧答案已删除*