内存故障 - c

时间:2014-02-27 13:01:47

标签: 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[j][i]=args[i];
         }
      else
         {
          cmdarg[j][i+1] = NULL;
          j++;
         }
       printf("%s\n",cmdarg[j][i]);
     }
   }

我对指针和数组不太熟悉

3 个答案:

答案 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)

最后,learn如何使用gdb调试器valgrind内存泄漏检测器。

答案 1 :(得分:2)

您永远不会在代码中初始化cmdarg变量。它将具有未指定的值,因此当您取消引用它时,存在未定义的行为。在您的情况下,这表现为分段错误。

答案 2 :(得分:2)

我不知道你的代码试图做什么,但我可以看到你正在考虑未初始化的变量'cmdarg'。

另一个adivce :在可能的情况下(我认为几乎总是可行)尽量避免三个层次的间接(***)。