首页 > 解决方案 > “有条件的跳转或移动取决于未初始化的值”,同时释放一个 char **

问题描述

我正在用 C 语言为学校编写一个极简主义的 shell。它工作正常,但使用 Valgrind 我得到了这个错误,我无法弄清楚我做错了什么。我在程序开始时得到它:

==9396== Conditional jump or move depends on uninitialised value(s)
==9396==    at 0x1093AC: get_env (msh.c:59)
==9396==    by 0x1094FA: main (msh.c:106)
==9396==  Uninitialised value was created by a heap allocation
==9396==    at 0x483577F: malloc (vg_replace_malloc.c:309)
==9396==    by 0x109341: get_env (msh.c:55)
==9396==    by 0x1094FA: main (msh.c:106)
==9396==

一开始,我在以下位置复制环境变量 ( extern char **environ) main()

 if (!(env = get_env(environ)))
         return (1);

这是功能:

 char    **get_env(char **environ)
 {
          char    **copy;
          char    **env_ptr;
          char    **cpy_ptr;

          if (!(copy = malloc(sizeof(copy) * get_tab_size(environ) + 1)))
                  exit(EXIT_FAILURE);
          env_ptr = environ;
          cpy_ptr = copy;
          while (*cpy_ptr)
          {
                  if (!(*cpy_ptr = ft_strdup(*env_ptr)))
                          exit(EXIT_FAILURE);
                  cpy_ptr++;
                  env_ptr++;
          }
          cpy_ptr = NULL;
          return (copy);
  }

在程序结束时,我使用此函数释放副本并得到相同的错误:

==9396== Conditional jump or move depends on uninitialised value(s)
==9396==    at 0x10BFC0: ft_free_tab2 (in /home/pom/dev/19/msh/msh)
==9396==    by 0x109593: main (msh.c:126)
==9396==  Uninitialised value was created by a heap allocation
==9396==    at 0x483577F: malloc (vg_replace_malloc.c:309)
==9396==    by 0x109341: get_env (msh.c:55)
==9396==    by 0x1094FA: main (msh.c:106)

这是释放功能:

  void    ft_free_tab2(char **env)
  {
          char    **ptr;

          if (!env)
                  return ;
          ptr = env;
          while (*ptr)
          {
                  free(*ptr);
                  ptr++;
          }
          free(env);
  }

当程序的其他部分使用副本时,我也会遇到问题。任何帮助,将不胜感激。

标签: cpointersunixvalgrind

解决方案


在这里,您为复制分配了一些未初始化的内存。

copy = malloc(sizeof(copy) * get_tab_size(environ) + 1)

然后你做一个指向它的指针。

cpy_ptr = copy;

到目前为止一切顺利,但是你这样做:

while (*cpy_ptr)

copy,因此也cpy_ptr指向未初始化的内存。您需要在取消引用指针之前对其进行初始化。

我还要说您使用sizeof(copy)而不是sizeof(*copy). 当然,在这种情况下它给出了相同的结果,但这只是因为它是一个双指针。


推荐阅读