C堆栈 - 最后一次推送覆盖以前的

时间:2015-04-11 20:25:10

标签: c parsing stack push overwrite

我读取了char*中保存的C命令(所以基本上是"字符串"命令)逐字节。

例如," echo a; echo b"。

假设我有char *wd = (char *)malloc(20);,当我读取一个字节时,存储在wd[i]中。如果我看到',wd[0]='e'wd[1]='c'wd[2]='h'wd[3]='o'wd[4]='\0'

我有char **wrd=(char**)malloc(sizeof(char*)*20);,我设置wrd[0]=wd;。然后,重复为wd再次分配空间的循环。设置wd[0]='a'wd[1]='\0'wrd[1]=wd;

然后我将wrd[0]wrd[1]合并到struct command

    struct command
    {
        union
        {
        char **word;
        } u;
    };

组合代码:

    wrd[wIndex]='\0';
    //initialize struct command called cmd
    cmd->u.word=NULL;
    cmd->u.word = (char **)malloc(sizeof(char *)*20);
    for(m=0; m<wIndex; m++)
    {
        cmd->u.word[m]=strdup(wrd[m]);
    }

然后,我尝试将struct命令推送到我的堆栈实现:

    struct Cstack
    {
    struct command *data[100];
    int size;
    }

    int Cstack_Push(Cstack *c, struct command *cmd)
    {
        if(c->size < STACK_MAX)
        {
            c->data[c->size]=cmd;
            c->size++;
        }
        else
            return -1;
        return 0;
    }

但是,当我多次执行Cstack_Push时,我的上次推送会覆盖之前的所有推送。因此,当我尝试从每个Cstack-&gt;数据数组中打印u.word时,它会打印所有相同的内容。 为什么要覆盖它们?

编辑:Cstack_Push被这样调用。

    struct command *cmd=(struct command*)malloc(sizeof(struct command)*20);
    cmd->u.word = (char **)malloc(sizeof(char *)*20);
    for(m=0; m<20; m++)
    {
      cmd->u.word[m]=strdup(wrd[m]);
    }


    Cstack_Push(Cstack, cmd);

0 个答案:

没有答案