【问题标题】:How to solve invalid read in C如何解决C中的无效读取
【发布时间】: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));

标签: c realloc


【解决方案1】:

好的,我已经设法解决了这个问题,因为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;
}

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 2022-01-26
    • 2021-11-30
    • 2018-08-03
    • 2019-12-09
    • 2020-07-30
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多