私のプログラムでは無効な読み取りの問題があります。履歴をサポートする簡単なシェルを作成しています。ここに私の問題だ、私は私が今cmd = ^p^l^
コマンド^p^l^
を、実行変数Cで不正な読み取りを解決するには
char *cmd = malloc(sizeof(char) * 256);
温家宝を持って、私は歴史を検索し、一致または同じ文字列を返す検索機能に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 *)'にキャストすることは意味がありません。コンパイラの警告を避けるためにこれを行った場合、コードには大きな問題があります。あなたは '#include'を忘れましたか? –
melpomene