-1
我的程序有一個無效的讀取問題,我在c中創建了一個支持歷史記錄的簡單shell,它是內置的。這裏是我的問題,我有一個變量如何解決無效的讀取C
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);
}
請發表[mcve]。 – kaylum
你是說你在做免費(「」)「嗎?因爲是的,那顯然會造成問題。 – melpomene
把'malloc()'轉換成'(void *)'沒有任何意義。如果你這樣做是爲了避免編譯器警告,你的代碼會遇到更大的問題。你忘了'#包括'嗎? –
melpomene