【问题标题】:Overwriting array of structs in C覆盖C中的结构数组
【发布时间】:2011-01-06 03:00:45
【问题描述】:

我正在尝试将指向结构数组的指针传递给函数。然后让函数创建自己的结构数组,用数据填充它,然后用新数组覆盖旧数组。

我很确定问题出在我尝试覆盖内存时。我认为我可能使用了错误的方法来覆盖内存(我应该使用内存功能吗?)或者我可能试图覆盖错误的东西。我不太确定我做错了什么。如果有人能指出我正确的方向,我将非常感激;我已经把头发从头上拔了三个小时了。

结构:

typedef struct
{
        char command;
        int argc;
        char* argv[];
}cmd;

代码:

int main(int argc, char *argv[])
{
    [... irrelevant code]
    cmd cmdv[count];
    cmd* cmdv_ptr = &cmdv[0];
    dissectCmd(cmdstr, cmdv_ptr);
    printf("%i", cmdv[0].argc);
    return 0;
}

void dissectCmd(char* str, cmd* cmdv)
{
    [... irrelevant code]
    cmd cmds[count];
    int i = 0;
    for(i = 0; i < count; i++)
    {
        cmd next;
        next.command = 'u';
        next.argc = 100;
        cmds[i] = next;
    }
    cmdv = cmds;
}

【问题讨论】:

  • cmd cmds[count] 是一个本地 VLA 数组,不是吗?即使你传递了 cmd **cmdv 和 *cmdv = cmds 也行不通。

标签: c memory struct


【解决方案1】:

你没有覆盖内存——语句cmdv = cmds只是复制指针(使cmdv指向cmds。)如果你想实际复制内存,你需要memcpy(cmdv, cmds, count * sizeof(cmd));

【讨论】:

  • ... 或者您可以在循环中执行 cmdv[i] = next; 并完全取消 cmds
  • @caf,可以工作,但前提是该循环内永远不会有任何过早的返回或异常。否则,它可能会导致数组部分被覆盖,这并不总是需要的。
【解决方案2】:

我不确定,但请尝试声明

void dissectCmd(char* str, cmd* cmdv)

作为

void dissectCmd(char* str, cmd** cmdv)

变化

cmdv = cmds;

(*cmdv) = &cmds;

并从现在的 main 更改当前调用

dissectCmd(cmdstr, cmdv_ptr);

dissectCmd(cmdstr, &cmdv_ptr);

另外,当你这样做时,你完全失去了旧数组的地址,造成了内存泄漏。除非您已经在第二个 [...无关代码] 段落中释放了该内存 :)

【讨论】:

  • 对,这行不通。你应该看看 chris dodd 的解决方案。如果您更改 printf("%i", cmdv[0].argc); 我的版本可能会起作用到 printf("%i", (*cmdv_ptr)[0].argc); D:
  • 这将使 cmdv_ptr 处于主悬空状态,指向 dissectCmd 堆栈帧中本地 cmds 的内存,当 dissectCmd 返回时释放该内存
  • 真的!我错过了 dissectCmd 中的 cmd 结构不是新的事实:ed :(
猜你喜欢
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多