传递给C中的函数时丢失char **数组的内容

时间:2014-11-08 18:10:54

标签: c arrays pointers struct char

我正在努力最终创建某种shell(最终基于 execvp()。)

struct commands {
    char cmdname[30]; // The name of the command
    enum ActionType action; /* char action[30];  what action to take */
};

struct userinput {
    struct commands theaction; //The chosen action
    char cmdentered[100]; // The cmd entered
    char **anyargs; //The tokenised command
    int argcount; //Argument count
};

我使用malloc初始化 anyargs 并创建一个字符串数组,每个参数都有一个字符串传递给execvp。

然后我获取用户输入,将输入转换为存储在anyargs中的标记,并检查字符串以找出需要采取的操作类型并将其存储在枚举中。

所有这些方法都是通过将指针传递给结构 userinput 作为方法参数来完成的 - 这很好。但是,当我将指向结构的指针传递给嵌套函数时,char** anyargs变为空。

我希望我添加的代码为答案提供了解决方案!另一个观察 - 当传递给函数内部的函数时,指针的实际值不会改变 - 只有指针的解除引用内容。

任何帮助都会非常感激!我试图将代码删除到我认为导致问题的区域! 谢谢!

int main() {

    struct commands cmdlist[4]; //Array of structures with all commands in them
    memset(cmdlist, 0, sizeof(cmdlist));

    struct userinput userentry = { { { 0 } } }; //Structure containing input
    userentry.theaction = cmdlist[0]; //Initialize empty command
    userentry.anyargs = calloc(100, sizeof(char));

    runEntry(&userentry, cmdlist); //Pass struct to function 

    free(userentry.anyargs);

    return 0;
}

int runEntry(struct userinput *userentry, struct commands thecmds[]) {
    int retval = 0;
    int childpid = 0;
    int processStatus;
    printf("\n    ... running cmd: \n\n");

    printUserEntry(userentry); //in printUserEntry, 
                               //userentry->anyargs[0] = NULL - why?
}

1 个答案:

答案 0 :(得分:1)

您已在char *中分配了100个字节的anyargs元素。但是,你还没有初始化这些指针。 anyargs[0]碰巧包含NULL的事实很好,但不能保证。 malloc()没有初始化分配的空间。

换句话说,当你说:

userentry.anyargs = malloc(100);

您已创建:

userentry.anyargs = {
  ???, // uninitialized char * 
  ???, // and another
  ???, // and another
  ...
  ???  // (100 / sizeof(char *)) entries later
};

您可以在循环中将这些显式初始化为NULL:

for ( i = 0; i < (100 / sizeof(char *)); ++i )
  userentry.anyargs[i] = NULL;

(或使用calloc()代替malloc()以确保所有内容都已清零。

或者您可以为它们分配一些空间:

for ( i = 0; i < (100 / sizeof(char *)); ++i )
  userentry.anyargs[i] = malloc(50);  // or some other length

或直接在runEntry()

中设置它们
userentry.anyargs[0] = "foo";
userentry.anyargs[1] = strdup(something);