我正在尝试在这种情况下分配内存,实际上我做了我想要的但是我想知道有没有更好的方法或者我做错了什么。
我只是想尽可能地编写功能,我还能为此做些什么。
void createDATABASE(int uint_val,int int_val,int str_val,int dbl_val)
{
int *decision=(int*)malloc(4*sizeof(int));
int i;
dbStore tdbStore;
t_CreateDatabase tCreateDatabase;
signal(SIGINT,err_memleak); // SIGNAL PROCESSING
memcpy(tCreateDatabase.filename,"test.bin",32); // database name copied
decision[0] = uint_val; decision[1] = int_val;
decision[2] = str_val; decision[3] = dbl_val;
for(i=0;i<4;i++){
if(decision[i] > 0){
switch(i){
case 0:
tdbStore.unsig_int = u_intAllocate(uint_val);
if(tdbStore.unsig_int==NULL) raise(SIGINT);
break;
case 1:
tdbStore.sig_int = n_intAllocate(int_val);
if(tdbStore.sig_int==NULL) raise(SIGINT);
break;
case 2:
tdbStore.strings = strAllocate(str_val);
if(tdbStore.strings==NULL) raise(SIGINT);
break;
case 3:
tdbStore.big_int = d_intAllocate(dbl_val);
if(tdbStore.big_int==NULL) raise(SIGINT);
break;
}
}
}
}
char **strAllocate(int val)
{
int column=1024,l;
char **node = (char**)malloc(val*sizeof(char*));
for(l=0;l<val;l++)
node[l] = (char*)malloc(column*sizeof(char));
return node;
}
double *d_intAllocate(int val)
{
double *node = (double*)malloc(val*sizeof(double));
return node;
}
unsigned int *u_intAllocate(int val)
{
unsigned int *node = (unsigned int*)malloc(val*sizeof(unsigned int));
return node;
}
int *n_intAllocate(int val)
{
int *node = (int*)malloc(val*sizeof(int));
return node;
}
感谢您的建议..
答案 0 :(得分:1)
建议1
您可以轻松替换
int *decision=(int*)malloc(4*sizeof(int));
通过
int decision[4];
当数组的大小固定时,使用malloc
是没有意义的。
建议2
请勿对malloc
返回的值使用显式强制转换。
使用
char **node = malloc(val*sizeof(char*));
而不是
char **node = (char**)malloc(val*sizeof(char*));
对malloc
的返回值使用显式强制转换已知存在问题。结帐Do I cast the result of malloc?了解详情。
建议3
您只需调用malloc
两次即可减少字符串分配的开销。
char **strAllocate(int val)
{
int column=1024,l;
char **node = malloc(val*sizeof(char*));
char* data = malloc(val*column); // No need for sizeof(char). It is always 1.
for(l=0;l<val;l++)
node[l] = data + i*column;
return node;
}
如果您使用此功能,则必须记住在释放内存时仅拨打free
两次。
free(*node);
free(node);