Ich arbeite daran, ein C-Programm zu machen, das grundsätzlich einen Satz aufnehmen kann und zählt, wie oft jedes Wort darin erscheint. Ich habe eine abgespeckte Version erstellt, die das Problem genau reproduziert.Warum ist dieses C-Programm an diesem Standort segzufällig?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct testStrut{
char * string;
int uses;
}word;
void grow();
int main(){
int i;
int count = 1;
word ** words;
words = (word **) malloc(count * sizeof(word *));
words[0] = (word *) malloc(sizeof(word));
for(i = 0; i < 10; i++){
printf("Re-looping i: %d \n", i);
printf("words[0]->string = %s \n", words[0]->string);
grow("TEST", words, &count);
}
printf("Done.");
return 0;
}
void grow(char * str, word ** words, int * count){
word ** tmp;
tmp = realloc(words, (*count) * sizeof(word *));
if(tmp){
tmp[(*count)-1] = malloc(sizeof(word));
tmp[(*count)-1]->string = malloc(strlen(str)+1); /*+1 for null terminator as pointed out */
strcpy(tmp[(*count)-1]->string, str);
tmp[(*count)-1]->uses = 1;
words = tmp;
(*count)++;
} else{
printf("Failure to allocate. \n");
exit(0);
}
printf("Count: %d and word[0] %s \n", (*count), str);
}
Neben der Ausgabe von einem Lauf:
Re-looping i: 0
words[0]->string = (null)
Count: 2 and word[0] TEST
Re-looping i: 1
words[0]->string = TEST
Count: 3 and word[0] TEST
Re-looping i: 2
words[0]->string = TEST
Count: 4 and word[0] TEST
Re-looping i: 3
words[0]->string = TEST
Count: 5 and word[0] TEST /*Prints it fine? */
Re-looping i: 4
Segmentation fault (core dumped) /*Suddenly unable to print it? */
ich verstehen mich nicht, warum die wachsen Funktion zwischen endet und durch die Schleife um den Wert der Worte wieder gehen [0] -> str ist plötzlich verloren. Gibt es etwas, das mir fehlt?
[Ich weiß, dass ich etwas zu befreien sollte ich malloc.I auch meine Methode Prototyp realisieren nicht die richtige ist, aber ich wollte nur ein schnelles Programm machen, dass mein Problem demonstriert]
Hinweis: Was bedeutet ' void f (int i) {i = 7;} int main() {int x = 5; f (x); printf ("% d \ n", x); Rückgabe 0;} 'Drucken? Nun 'int ändern I' zu' Wort ** words' und 'int x' zu' Wort ** words' und '7' zu' realloc (...) ' – immibis
Ein weiterer Fehler ist, dass Sie eine gemacht haben Falsche "String" -Zuweisung, Länge eines Strings ist "strlen (str) + 1", um das NUL-Beendigungszeichen zu berücksichtigen. –
Ihr Beispiel druckt 5, da ich von Wert übergeben wird, nicht ist, wenn ich Wort passieren ** Worte es ein Zeiger so würden alle Änderungen auch in Haupt widerspiegeln? Danke Jean für das fangen! Mein schlechtes, ich habe bearbeitet, um diese Änderung widerzuspiegeln. – Nateb1121