由于malloc导致地址越界和内存泄漏

由于malloc导致地址越界和内存泄漏,c,memory-management,memory-leaks,malloc,strtok,C,Memory Management,Memory Leaks,Malloc,Strtok,我正在尝试标记一个字符串 输入数组中存储了不同的行(char**) 我使用下面的函数将生成的不同令牌存储到不同的数组中 int tokenize_string(int max_lines,char *input_lines[max_lines],char **tokens) { char *token; int index,token_index=0; for(index = 0; index < max_lines;++index) {

我正在尝试标记一个字符串

输入数组中存储了不同的行(char**)

我使用下面的函数将生成的不同令牌存储到不同的数组中

int  tokenize_string(int max_lines,char *input_lines[max_lines],char **tokens)
{
    char *token;
    int index,token_index=0;

    for(index = 0; index < max_lines;++index)
    {
        token = strtok(input_lines[index]," ");

        while(token != NULL)
        {
            tokens[token_index] = malloc(sizeof(char*));
            tokens[token_index] = token;
            token = strtok(NULL," ");
            token_index++;
        }
    }
    return token_index;
}
我知道问题在于
malloc
for
循环

//编辑

int main(int argc,char *argv[])
{
    int max_lines = atoi(argv[1]);
    char *input_lines[max_lines];
    char **tokens;
    char *output_string;
    int token_index;
    tokens=malloc(sizeof(char*));

    get_input(max_lines,input_lines);
    token_index = tokenize_string(max_lines,input_lines,tokens);
    output_string= concat_string(tokens,output_string,token_index);
    print_string(output_string);
}

void get_input(int max_lines,char *input_lines[max_lines])
{
   int index;
   printf("Enter %d lines",max_lines);

   for(index = 0; index < max_lines;++index)
   {
       input_lines[index] = malloc(sizeof(char*));
       fgets(input_lines[index],50,stdin);
   }
}
intmain(intargc,char*argv[])
{
int max_line=atoi(argv[1]);
字符*输入行[最大行];
字符**代币;
字符*输出字符串;
int-token_索引;
代币=malloc(sizeof(char*));
获取\u输入(最大\u行,输入\u行);
令牌索引=令牌化字符串(最大行、输入行、令牌);
输出字符串=concat字符串(令牌、输出字符串、令牌索引);
打印\u字符串(输出\u字符串);
}
void get_input(int max_行,char*input_行[max_行])
{
整数指数;
printf(“输入%d行”,最大行数);
对于(索引=0;索引
有什么建议吗


谢谢

让我们仔细看看这两行:

tokens[token_index] = malloc(sizeof(char*));
tokens[token_index] = token;
首先,为指针分配空间,并将其分配给
令牌[token\u index]
。下一行重新分配
令牌[token\u index]
指向不同的位置,丢失了
malloc
返回的指针。它与使用
int
变量(让我们命名为
i
)没有什么区别,而是

然后想知道为什么
i
不是
5

如果调用函数中的
令牌
的生存期小于(或等于)输入行
的生存期,则不需要在此处分配内存,来自
令牌
的分配(第二行)就足够了


还有其他问题,比如你没有在任何地方增加
token\u index

至于“无效写入”,如果没有显示如何调用此函数的正确值,就很难说出任何内容。

malloc()
中,为指针本身分配空间,然后将值分配给指向该指针的指针。下一行,您将覆盖它

假设您需要在这个函数的生命周期之后使用令牌作为令牌数组,您需要的是以下内容。您在
tokens
数组中为令牌包含的字符串创建空间,然后将其复制

int tokenize_string(int max_lines,char *input_lines[max_lines],char **tokens)
{
    char *token;
    int index,token_index=0;

    for(index = 0; index < max_lines;++index)
    {
        token = strtok(input_lines[index]," ");

        while(token != NULL)
        {
            size_t len = strlen(token) + 1;
            tokens[token_index] = malloc(len);
            strcpy(tokens[token_index], token);
            token = strtok(NULL," ");
        }
    }
    return token_index;
}
不是像我相信您所期望的那样,创建指向字符串的指针数组。这只是说,
tokens
指向一个内存区域,该区域有足够的空间用于指向
char
的单个指针。您需要预先定义要指向的字符串的最大数量,或者找到提前知道的方法

get\u input()
中,您正在做一件类似的事情——使用

input_lines[index] = malloc(sizeof(char*));
尝试为新字符串创建空间,但这只是指向指向
char
的指针。给定
fgets()
调用,并限制为50个字符,您只需执行以下操作即可

input_lines[index] = malloc(50);
这样你就有了50个字符的空间。之后,您需要确保它是以null结尾的字符串

最重要的是
malloc(sizeof(char*))
不是为字符串分配空间,而是为指针分配空间。这些都不一样,我建议多读一点


本质上,您似乎在分配的内存范围之外进行写入。

tokens[token\u index]=malloc(sizeof(char*))是不必要的(该值在下一行被覆盖)。你能提供调用这个函数的代码吗?您为
**代币传递的是什么?作为
代币传递的是什么?它是如何定义和初始化的?另外,了解您在
main.c:25
..:29
上有哪些代码,以及哪些行是
函数。c:28
:29
。我的水晶球坏了,我只是把指针当作记号传过去`字符*代币;令牌=malloc(sizeof(char))令牌=malloc(sizeof(char*)//25标记索引=标记化字符串(最大行、输入行、标记)//29
sizeof(char)
定义为1,因此如果您想保留在存储端,可以删除它的冗余项,并将其替换为
sizeof*令牌[token\u index]
。在这个函数中,我不知道要输入的字符串的数量,因此在使用
strtok
时,我的地址超出了限制。通过命令行输入最大行数,并获取未知长度的输入行,然后标记它们。我不确定您的错误是什么,您能否编辑您的帖子并从
main()
中添加少量代码,以便我们可以看到更多正在发生的事情?我也分享了同样的内容。。希望它能帮助我增加token_index的值,因为我需要知道token的总数
tokens=malloc(sizeof(char*));
input_lines[index] = malloc(sizeof(char*));
input_lines[index] = malloc(50);