c - “有条件的跳转或移动取决于未初始化的值”,同时释放一个 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);
}
当程序的其他部分使用副本时,我也会遇到问题。任何帮助,将不胜感激。
解决方案
在这里,您为复制分配了一些未初始化的内存。
copy = malloc(sizeof(copy) * get_tab_size(environ) + 1)
然后你做一个指向它的指针。
cpy_ptr = copy;
到目前为止一切顺利,但是你这样做:
while (*cpy_ptr)
copy
,因此也cpy_ptr
指向未初始化的内存。您需要在取消引用指针之前对其进行初始化。
我还要说您使用sizeof(copy)
而不是sizeof(*copy)
. 当然,在这种情况下它给出了相同的结果,但这只是因为它是一个双指针。
推荐阅读
- c# - 使用 Entity Framework Core 时我应该处置 DbContext
- c# - 查询日期之间每种类型的一条记录
- java - 如何在 Spring MVC 控制器中接收 multipart/form-data?
- javascript - Vuetify 密码确认不起作用
- c# - 无法反序列化当前的 JSON 数组(例如 [1,2,3])& {“解析值时遇到意外字符:e. Path '', line 0, position 0.”}
- tensorflow - torch.nn.LSTM 是否等于 tf.nn.rnn_cell.BasicLSTMCell?
- gradle - Gradle 应用程序构建不包含自己的 jar
- directadmin - 禁用一个域的直接管理员访问权限,设置另一个位置进行管理
- javascript - 输入范围滑块值应指向页面加载时 cgi 脚本值的输出
- google-chrome - 摘要式身份验证请求中的 HTTP 无授权字段