gpt4 book ai didi

c - 将结构分配给静态数组

转载 作者:太空宇宙 更新时间:2023-11-04 03:01:57 26 4
gpt4 key购买 nike

我有一个静态数组,在一个函数中,我在循环中创建了一个新结构,并将其分配给数组中的每个索引。在函数中我可以看到值,但在不同的函数中我看到数组值的垃圾。我必须为这样的事情使用 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;
}

最佳答案

你的代码有两个问题:

问题 1:

结构 new_struct 本身位于堆栈上,一旦函数范围结束,它就会被释放,所以你的数组元素指向函数范围之外的东西不会存在,又名垃圾。

解决方案:
该结构需要驻留在堆内存中才能被超出范围访问。


问题 2:

new_struct.typename = value;
new_struct.MIMEtype = value2;

创建传递给函数的指针的浅拷贝add_to_filetype_table(),从示例中不清楚谁拥有传递给函数的指针&它们的生命周期是多少,如果这些指针在您调用 get_table_value() 之前被释放,那么您的全局静态结构将留下悬空指针,因此您在输出它们时会得到垃圾值。

解决方案:

您需要对传递的指针进行深拷贝
为结构成员分配内存,然后将字符串复制(strcpy())到分配的内存中。

关于c - 将结构分配给静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10424985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com