在不断努力以最终创建某种外壳(最终基于 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中的标记,并检查字符串以找出需要采取哪种操作并将其存储在枚举中。
所有这些方法都是通过将指针作为方法参数传递给struct
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?
}
最佳答案
您已经在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);