Ich versuche, eine Zeichenfolge zu tokenisieren.Adresse außerhalb des Bereichs und Speicherverlust wegen malloc
Es gibt verschiedene Linien, die in einem Eingabefeld (char **)
Am unter Verwendung der folgenden Funktion zu speichern, die verschiedenen Tokens gespeichert werden, die in einem anderen Array erzeugt werden.
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;
}
bei der Verwendung von valgrind die unten ist
==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)
Ich weiß, gezeigt, dass das Problem mit malloc
und der for
Schleife ist.
// 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);
}
}
irgendwelche Vorschläge?
Danke
'Token [Token_Index] = malloc (sizeof (char *));' ist unnötig (der Wert wird in der nächsten Zeile überschrieben). Können Sie den Code bereitstellen, der diese Funktion aufruft? Was passierst du für ** Tokens? –
Was wird als "Token" weitergegeben? Wie ist es definiert und initialisiert? – alk
Es wäre auch interessant zu wissen, welchen Code Sie auf 'main.c: 25' und' ...: 29' haben, und welche Zeilen 'functions.c: 28' und' ..: 29' sind. Meine Kristallkugel ist gebrochen, – alk