使用fgets后,char*值发生变化

问题描述 投票:-1回答:1

所以我的第一个问题是. 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;
        }
c
1个回答
2
投票

问题在于你的这一行 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 字段! 同样的修复方法也需要应用于此!

© www.soinside.com 2019 - 2024. All rights reserved.