“有条件的跳转或移动取决于未初始化的值”,同时释放一个字符**

问题描述 投票:1回答:2

我正在用C语言编写一个用于学校的简约外壳。它工作正常,但使用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);
  }

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

c pointers unix valgrind
2个回答
3
投票

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

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

然后创建一个指向它的指针。

cpy_ptr = copy;

到目前为止很好,但是您可以这样做:

while (*cpy_ptr)

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

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


2
投票

问题是您的表情:

while (*cpy_ptr)

正在测试未分配的空间。您可能要测试原始文件:

while (*env_ptr)

即虽然我们还没有到达字符串的原始以空值终止的向量的末尾...

另外,您的最后一行令人怀疑:

cpy_ptr = NULL;

这没有任何作用,因为您要在超出范围之前分配给没有下次使用的局部变量。您几乎肯定想要这个:

*cpy_ptr = NULL;  // Null-terminate the copied vector
© www.soinside.com 2019 - 2024. All rights reserved.