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

热情

我正在用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);
  }

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

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

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

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

cpy_ptr = copy;

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

while (*cpy_ptr)

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

CPP中的Valgrind和内存泄漏:“有条件的跳转或移动取决于未初始化的值”

有条件的跳转或移动取决于未初始化的值和无效的大小写

条件跳转或移动取决于未初始化的值

Valgrind:使用哈希函数时,条件跳转或移动取决于未初始化的值

条件跳转或移动取决于 for 循环中带有 strcat 的未初始化值

Valgrind 消息:条件跳转或移动取决于未解析的未初始化值

如何解决“有条件的跳跃或移动取决于未初始化的值” valgrind错误而导致的strlen错误?

Valgrind:使用atomic :: compare_exchange_weak时,条件跳转或移动取决于未初始化的值

fread() 导致 Valgrind 错误:“条件跳转或移动取决于未初始化的值”

查明“条件跳转或移动取决于未初始化的值” valgrind消息

条件跳转或移动取决于使用valgrind的未初始化值

条件跳转或移动取决于未初始化的值strcat

错误:条件跳转或移动取决于未初始化的值-C valgrind

Valgrind + C:条件跳转或移动取决于未初始化的值

条件跳转或移动取决于std :: wistringstream的未初始化值

C ++中的动态数组-条件跳转或移动取决于未初始化的值

Valgrind:条件跳转或移动取决于未初始化的值-打开文件

如何修复C中的“条件跳转或移动取决于未初始化的值”错误

条件跳转或移动取决于 strcpy 处的未初始化值

二进制搜索树,Valgrind条件跳转或移动取决于未初始化的值

Valgrind:libnvidia-glcore.so.346.47条件跳转或移动取决于未初始化的值

@有条件的bean初始化

数组初始化-有条件的

如何有条件地格式化Kendo UI网格单元格(取决于值)

有条件的替换取决于其他列的值

有条件的has_one关系取决于布尔值

有条件的Ansible中的通知取决于角色

GitlabRunner有条件运行取决于提交消息

有条件的@HostBinding取决于@Input()