2016-12-28 100 views
-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); 
} 
+1

請發表[mcve]。 – kaylum

+2

你是說你在做免費(「」)「嗎?因爲是的,那顯然會造成問題。 – melpomene

+1

把'malloc()'轉換成'(void *)'沒有任何意義。如果你這樣做是爲了避免編譯器警告,你的代碼會遇到更大的問題。你忘了'#包括'嗎? – melpomene

回答

3

好吧,我已成功地解決了這一問題,因爲user3121023指出*cmd =將丟棄該內存分配,我決定使用strcpymemset而不是=

//libraries here 
# define SIZE 256 

char *cmd = malloc(sizeof(char) * SIZE); 

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]; 
    memset(*cmd, 0, SIZE); 
    strcpy(*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"); 
     memset(*cmd, 0, SIZE); 
     strcpy(*cmd, ""); 
     *pos = 0; 
     return ; 
    } 
    i = ft_strlen(*cmd); 
    ft_cursor(*cmd, i + 1, &hist); 
    *pos = i; 
} 
相關問題