【问题标题】:char* value changing after use of fgets使用 fget 后 char* 值发生变化
【发布时间】:2020-04-24 18:06:50
【问题描述】:

所以我的第一个问题是。 fgets 会覆盖其他 char* 值吗?

否则,我不确定我是如何弄乱我的 malloc 的。下面是值发生变化的代码。第一行是创建变量的位置。

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;
        }

【问题讨论】:

  • 我什么都不懂。有什么问题吗? fgets 写入表达式行指向的字符数组。有什么问题?
  • @Vlad 复制指针未指向数据,我认为(见答案)。也许??大概?
  • 道歉,本质上。例如,data[0] 中的 char* 名称变为随机字符。创建变量后,data[0] 看起来像这样 -> data[0]->name = 0x6054d0 "val01"。但是在运行 fgets 之后。数据[0]->名称=0x6054d0“”

标签: c


【解决方案1】:

问题在于您的 createVariable 函数中的这一行:

    var->name = name;

这样做是将作为第一个参数给出的指针复制到var结构中的name字段;它制作指向数据的(单独)副本!因此,假设您使用与第一个参数相同的变量多次调用 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);
        //...

但请注意,当您(最终)删除它时,您现在需要确保从 each 对象中释放该内存。像这样的:

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
}

编辑:重新阅读您的问题,并注意到您在 string 字段中犯了同样的错误!需要对其应用相同的修复程序!

【讨论】:

  • 非常感谢!这非常有效。我也会添加删除代码。
猜你喜欢
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2014-11-21
  • 1970-01-01
相关资源
最近更新 更多