我不知道为什么在运行此代码时出现内存故障(核心转储)
if (flg == 4) // PIPE
{
char **cmds;
char ***cmdarg;
int j=0;
cmds = split_str(cmd, "|");
for (i = 0; args[i] != NULL; i++)
{
if (strcmp(args[i], "|") == 1)
{
cmdarg[j][i]=args[i];
}
else
{
cmdarg[j][i+1] = NULL;
j++;
}
printf("%s\n",cmdarg[j][i]);
}
}
我对指针和数组不太熟悉
答案 0 :(得分:2)
cmdarg
未初始化。而且我确信GCC在被gcc -Wall -g
调用时会警告你。
你可以保持它的长度,例如
int cmdarglen = 0;
然后将其初始化为某个合适的默认大小:
#define INITIAL_CMDARG_SIZE 10
cmdarg = calloc(INITIAL_CMDARG_SIZE, sizeof(*cmdarg));
if (!cmdarg) { perror("calloc cmdarg initial"); exit (EXIT_FAILURE); );
cmdarglen = INITIAL_CMDARG_SIZE;
然后在需要时增长它,例如
if (j >= cmdarglen) {
int newcmdarglen = 5*j/4+10;
char***newcmdarg = calloc(newcmdarglen, sizeof(*cmdarg));
if (!newcmdarg)
{ perror("calloc growing cmdarg"); exit(EXIT_FAILURE); };
memcpy (newcmdarg, cmdarg, sizeof(*cmdarg)*j);
free (cmdarg);
cmdarg = newcmdarg;
}
在for
循环中正确插入。当然,您可能需要初始化cmdarg
的每个元素(通过单独分配它们)。
以后不要忘记free(cmdarg)
。
答案 1 :(得分:2)
您永远不会在代码中初始化cmdarg
变量。它将具有未指定的值,因此当您取消引用它时,存在未定义的行为。在您的情况下,这表现为分段错误。
答案 2 :(得分:2)
我不知道你的代码试图做什么,但我可以看到你正在考虑未初始化的变量'cmdarg'。
另一个adivce :在可能的情况下(我认为几乎总是可行)尽量避免三个层次的间接(***)。