所以我的第一个问题是. fgets是否会覆盖其他char*值?
否则,我真不知道我的mallocs是怎么搞的。下面是改变值的代码。第一行是创建变量的地方。
data[dataIndex++] = createVariable(varName, 1, value, -1, line, NULL);
创建变量的代码
Variable *createVariable(char *name, int type, int val, int len, int line, char *string)
{
Variable *var = malloc(sizeof(Variable));
var->name = name;
var->setting = type;
var->num = val;
var->length = len;
var->line = line;
var->string = string;
return var;
}
数据是什么样子的,如何创建的。
Variable **data;
data = malloc(4 * sizeof(Variable *));
忘了加这个,但下面是我的fgets代码
if (fgets(line, MAX_LINE_LENGTH, in) == NULL)
{
break;
}
问题在于你的这一行 createVariable
函数。
var->name = name;
它的作用是复制 指针 的第一个参数。name
领域中 var
结构;它 不 制作一个指向数据的(单独)副本!所以,假设你调用了这个数据。所以,假设你调用 createVariable
多次,与第一个参数相同的变量,那么...。每一 创建的对象将具有 一样 地址在其 name
字段,以及您对其中任何一个字段的任何修改(通过 fgets
)将改变 都 的。
为了解决这个问题,您需要分配给它们的 新的 存储器 name
字段,每次调用 createVariable
函数,然后将字符串数据复制到该函数中。最简单的方法是使用 strdup
功能。
Variable *createVariable(char *name, int type, int val, int len, int line, char *string)
{
Variable *var = malloc(sizeof(Variable));
var->name = strdup(name);
//...
var->string = strdup(string);
//...
但请注意,你现在需要确保释放那些来自于 各 对象时,(最终)删除它。类似这样。
void deleteVariable(Variable** var)
{
free((*var)->name); // free the name memory
free((*var)->string); // free the string memory
free(*var); // free the actual structure
*var = NULL; // set the pointer to NULL - to prevent multiple frees
}
EDIT: 刚刚重新阅读了你的问题,并注意到你也犯了同样的错误。string
字段! 同样的修复方法也需要应用于此!