我有一个静态数组,在函数中我在循环中创建一个新结构并将其分配给数组中的每个索引。在函数中,我可以看到值,但在不同的函数中,我看到了数组值的垃圾。我是否必须使用malloc来做这样的事情?
struct file_types
{
char * typename;
char * MIMEtype;
};
static struct file_types *file_type_table; //Table of parameters
static int file_type_table_num=0;
int add_to_filetype_table(char *param, int param_len, char *value, int val_len, char* value2)
{ if ((param == NULL) || (value==NULL) || (value2 == NULL))
return 0;
if ((strcmp(param,"type") != 0) || (strcmp(value,"") == 0) || (strcmp(value2,"") == 0))
return 0;
if (file_type_table==NULL)
file_type_table = emalloc(sizeof(struct file_types));
else
file_type_table = erealloc(file_type_table, (file_type_table_num*sizeof(struct file_types)+ sizeof(struct file_types)));
file_type_table_num += 1;
int index = file_type_table_num -1;
struct file_types new_struct;
new_struct.typename = value;
new_struct.MIMEtype = value2;
file_type_table[index] = new_struct;
return 1;
}
问题在于访问结构:
char* get_table_value(char * key)
{ logg("In get_table_value");
int i;
char* value;
for (i=0;i<file_type_table_num;i++)
{
if (strcmp(((file_type_table)[i]).typename, key) == 0)
{
return (file_type_table[i]).MIMEtype;
}
}
return value;
}
答案 0 :(得分:2)
您的代码中存在两个问题:
问题1:
结构new_struct
本身位于堆栈上,一旦函数的作用域结束就会被释放,那么你的数组元素指向超出函数范围的是不存在的东西,又名垃圾。
<强>解决方案:强>
结构需要驻留在堆内存上,以便超出范围进行访问。
问题2:
new_struct.typename = value;
new_struct.MIMEtype = value2;
创建传递给函数add_to_filetype_table()
的指针的浅拷贝。从示例中不清楚谁拥有传递给函数&amp;的指针。它们的生命周期是什么,如果在调用get_table_value()
之前释放这些指针,那么你的全局静态结构会留下悬空指针,因此在输出时会得到垃圾值。
<强>解决方案:强>
您需要对传递的指针进行深层复制
将内存分配给结构成员,然后将字符串复制(strcpy()
)到已分配的内存中。