Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存故障-c_C_Linux - Fatal编程技术网

内存故障-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。