假设我们有这样的代码:动态内存分配
int *h;
for(int i=0;i<5;i++){
h = malloc(sizeof(int));
h[i] = i;
}
我这里的问题是我要开始与空数组,即刚刚宣布int *h
,然后*h
将增长运行时使用realloc
。我试过使用这个例子,但它没有分配一个连续的内存空间,也不起作用。我知道realloc
工作分配malloc后有什么解决方法吗?
假设我们有这样的代码:动态内存分配
int *h;
for(int i=0;i<5;i++){
h = malloc(sizeof(int));
h[i] = i;
}
我这里的问题是我要开始与空数组,即刚刚宣布int *h
,然后*h
将增长运行时使用realloc
。我试过使用这个例子,但它没有分配一个连续的内存空间,也不起作用。我知道realloc
工作分配malloc后有什么解决方法吗?
为了适应您正在尝试做的事情,realloc(NULL, size)
与malloc(size)
的功能完全相同。你可以写你的循环是这样的:
int *h = 0;
size_t avail = 0;
for (size_t i = 0; more_data_available(); i++) {
if ((i+1) * sizeof(int) > avail) {
avail = avail == 0 ? 8*sizeof(int) : avail*2;
int *nh = realloc(h, avail);
if (!nh) abort();
h = nh;
}
h[i] = next_data_item();
}
但需要注意的令人费解的?:
表达我不得不使用放大avail
。如果我在已经分配了一些空间的情况下启动循环,那将会更加干净;然后我可以只使用malloc
正常:
size_t avail = 8 * sizeof(int);
int *h = malloc(avail);
if (!h) abort();
for (size_t i = 0; more_data_available(); i++) {
if ((i+1) * sizeof(int) > avail) {
avail *= 2;
int *nh = realloc(h, avail);
if (!nh) abort();
h = nh;
}
h[i] = next_data_item();
}
这'H = malloc的(INT的sizeof)();用于''ħ只分配一个'int' – 101010
你唯一分配空间[0]'和漏水先前'h' – amdixon
指针不是数组! – Olaf