由于malloc导致地址越界和内存泄漏
我正在尝试标记一个字符串 输入数组中存储了不同的行(char**) 我使用下面的函数将生成的不同令牌存储到不同的数组中由于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) {
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标记索引=标记化字符串(最大行、输入行、标记)//29sizeof(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);