文字列をトークン化しようとしています。アドレスが範囲外で、mallocによるメモリリーク
入力配列(文字**)に格納されている異なる行がある
異なるアレイに生成され、異なるトークンを格納するために、次の関数を使用しています。
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;
}
を使用valgrindの以下のときには、私は問題がmalloc
とfor
ループであることを知っている
==25710== Invalid write of size 8
==25710== at 0x400AA6: tokenize_string (functions.c:28)
==25710== by 0x400953: main (main.c:29)
==25710== Address 0x51c3048 is 0 bytes after a block of size 8 alloc'd
==25710== at 0x4C27A2E: malloc (vg_replace_malloc.c:270)
==25710== by 0x40091B: main (main.c:25)
==25710==
==25710== Invalid write of size 8
==25710== at 0x400ABA: tokenize_string (functions.c:29)
==25710== by 0x400953: main (main.c:29)
==25710== Address 0x51c3048 is 0 bytes after a block of size 8 alloc'd
==25710== at 0x4C27A2E: malloc (vg_replace_malloc.c:270)
==25710== by 0x40091B: main (main.c:25)
が示されています。
// EDIT
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);
}
}
任意の提案ですか?あなたはポインタのためのスペースを割り当て、tokens[token_index]
に割り当てる最初に
tokens[token_index] = malloc(sizeof(char*));
tokens[token_index] = token;
:
は
'tokens [token_index] = malloc(sizeof(char *));'は不要です(値は次の行に上書きされます)。この関数を呼び出すコードを提供できますか?あなたは '**トークン 'のために何を渡していますか? –
「トークン」として渡されるものは何ですか?どのように定義され、初期化されていますか? – alk
'main.c:25'と' ...:29'のコードと、 'functions.c:28'と' ..:29'のコードを知ることも興味深いでしょう。私の水晶球は壊れています。 – alk