【发布时间】:2016-12-28 09:42:17
【问题描述】:
我的程序有一个无效的读取问题,我正在用 c 语言创建一个简单的 shell,它支持历史并且它是内置的。这是我的问题,我有一个变量
char *cmd = malloc(sizeof(char) * 256);
我运行命令^p^l^,现在运行cmd = ^p^l^,我将cmd 传递给搜索历史并返回匹配或相同字符串的搜索函数。 ft_man_search_replace(&cmd, &pos, hist)
void ft_man_search_replace(char **cmd, int *pos, t_stack hist)
{
char **split;
t_search_hist search;
int i;
// splits ^string^string^ into array
split = ft_strsplit(*cmd + 1, '^');
i = *pos;
// get previous history and assign it to haystack
search.haystack = ft_get_prev_hist(hist);
search.needle = split[0];
search.with = split[1];
*cmd = ft_search_replace(search, 0, 0, 0);
//if returned string is equal to *cmd, there was no match
//assign *cmd to empty string.
if (ft_strequ(search.haystack, *cmd))
{
ft_putendl("\n21sh: substitution failed");
*cmd = "";
*pos = 0;
return ;
}
i = ft_strlen(*cmd);
ft_cursor(*cmd, i + 1, &hist);
*pos = i;
}
运行此函数后,cmd 似乎不再具有256 的内存分配,当我输入无效的内容时,我的猜测是我到达了字符串的末尾。例如,如果未找到匹配项,我分配*cmd = "",现在如果我尝试修改cmd,我会得到无效读取。我该如何解决这个问题?我尝试使用以下函数重新分配,因为我不允许使用realloc。
void *ft_realloc(void *ptr, size_t len)
{
void *real;
real = (void *)malloc(len);
if (real)
{
memset(real, 0, len);
memcpy(real, ptr, strlen(ptr));
}
free(ptr);
return (real);
}
【问题讨论】:
-
你是说你在做
free("")?因为是的,这显然会导致问题。 -
将
malloc()转换为(void *)毫无意义。如果你这样做是为了避免编译器警告,你的代码会有更大的问题。你忘了#include <stdlib.h>吗? -
不,库在那里,抱歉我不能发布一个工作示例代码太长而且有很多功能。
-
顺便说一句
memcpy(real, ptr, strlen(ptr)); memset(real, 0, len);-->memset(real, 0, len);memcpy(real, ptr, strlen(ptr));