我正在用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)
。当然,在这种情况下,它给出的结果相同,但这仅是因为它是双指针。
问题是您的表情:
while (*cpy_ptr)
正在测试未分配的空间。您可能要测试原始文件:
while (*env_ptr)
即虽然我们还没有到达字符串的原始以空值终止的向量的末尾...
另外,您的最后一行令人怀疑:
cpy_ptr = NULL;
这没有任何作用,因为您要在超出范围之前分配给没有下次使用的局部变量。您几乎肯定想要这个:
*cpy_ptr = NULL; // Null-terminate the copied vector