内存故障-c
我不知道为什么在运行此代码时内存错误内核被转储内存故障-c,c,linux,C,Linux,我不知道为什么在运行此代码时内存错误内核被转储 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
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]);
}
}
我对指针和数组不是很在行cmdarg未初始化。我确信,当作为GCC-Wall-g调用时,GCC会警告您这一点
你可以保持它的长度
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的每个元素
以后别忘了释放Cmdarg
最后,介绍如何使用gdb调试器和内存泄漏检测器。您从未在代码中初始化cmdarg变量。它将有一个未指定的值,因此当您取消引用它时,存在未定义的行为。在您的情况下,这表现为一个分段错误。我不知道您的代码试图做什么,但我可以看到您正在引用一个未初始化的变量“cmdarg”。另一个建议:如果可能,我认为几乎总是可以尝试避免三级间接***.split str返回什么?什么是args?这与C Shell无关。从标题中删除它。它在哪里崩溃?您是使用调试器运行它的吗?您是通过分配来初始化它的。例如:cmdarg=newchar**[];稍后,您必须为每个单元格分配。i、 e.指向此数组中指针**项的每个指针。再次,我会尽量避免这样高的间接方向。PaZo:新的是C++,OP在谈论C。