1

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

1 回答 1

2

您的代码中有两个问题:

问题1:

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

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


问题2:

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

创建传递给函数的指针的浅表副本add_to_filetype_table(),从示例中不清楚谁拥有传递给函数的指针以及它们的生命周期是什么,如果在调用之前释放了这些指针,get_table_value()则留下全局静态结构带有悬空指针,因此在输出它们时会得到垃圾值。

解决方案:

您需要制作正在传递的指针的深层副本
为结构成员分配内存,然后将strcpy()字符串复制()到分配的内存中。

于 2012-05-03T04:16:46.163 回答