【发布时间】:2011-10-06 02:23:10
【问题描述】:
我正在尝试使用 realloc() 在 C 中实现动态数组。我的理解是 realloc() 保留了旧指针指向的内存块的旧内容,但我的以下测试代码另有说明:
#include <stdio.h>
#include <stdlib.h>
int DARRAYSIZE=5;
typedef struct dynamicArray{
int size;
int *items;
}DArray;
int init(DArray *DAP){ //initialise the DArray
DAP->items=(int *)malloc(sizeof(int)*DARRAYSIZE);
if(DAP->items){
DAP->size=0;
return 0;
}else{
printf("Malloc failed!\n");
return 1;
}
}
void print(DArray *DAP){ //print all elements in the DArray
int i=0;
for(;i<DAP->size;i++)
printf("%d\t",DAP->items[i]);
printf("\n");
}
void add(DArray *DAP,int val){ //add the new val into the DArray
if(!full(DAP)){
DAP->items[DAP->size++]=val;
}else{
if(!grow(DAP)){
DAP->items[DAP->size++]=val;
}else
exit(1);
}
}
int full(DArray *DAP){ //returns 1 if the DAarray is full
if(DAP->size==DARRAYSIZE)
return 1;
else
return 0;
}
int grow(DArray *DAP){ //grows the DArray to double its original size
int *temp=(int *)realloc(DAP->items,DARRAYSIZE*2);
if(!temp){
printf("Realloc failed!\n");
return 1;
}else{
DAP->items=temp;
DARRAYSIZE*=2;
printf("Darray doubled and current contents are:\n");
print(DAP);
return 0;
}
}
void destroy(DArray *DAP){ //destroies the DArray
free(DAP->items);
}
int main(void){
DArray newDA;
if(!init(&newDA)){
int i;
for(i=1;i<30;i++)
add(&newDA,i);
}else
exit(1);
destroy(&newDA);
return 0;
}
我所做的是在函数grow() 中将数组的大小加倍后立即打印数组的内容。我使用以下代码编译了代码:
:gcc -版本 i686-apple-darwin11-llvm-gcc-4.2
下面是输出:
输出中有意外的 0。
请指教我在这里做错了什么,谢谢!
【问题讨论】:
-
发布代码或输入/输出时,最好复制/粘贴文本而不是屏幕截图。
-
需要将DARRAYSIZE中的信息合并到结构中;你不能让一个全局变量错误控制
DArray类型的所有变量。每个动态数组的大小相互独立。 -
@Jonathan,感谢您的建议,我的代码中确实需要更好的封装。
标签: c memory-management