Hilfe bei SpeicherReallozierung
-
Ich brauche mal Hilfe. Und zwar geht es um Folgendes:
Ich will ein Programm schreiben, was eine Textdatei einliest und die einzelnen Zeilen in einem Array speichert. Ich weiss, dass solche Fragen schonmal gestellt wurden, aber ich habe jetzt einen Ansatz geschrieben, und wollte nur mal wissen, ob das so in Ordnung ist, oder man es evtl. an einigen Stellen vereinfachen kann:
#include <stdio.h> #include <string.h> #define BUF 255 int vergleich(char *inhalt[], int anzahl){ int i=0, j=0, fundstellen = 0; char test[20]; for (i = 0; i < anzahl; i++) { //for (j=0; j < anzahl; j++){ if(strcmp(inhalt[i], "./open_history\n")==0) { //printf("Gleich: %s \n" ,inhalt[i]); fundstellen++; } //} } return fundstellen; } int main() { FILE *datei; char puffer[BUF]; char *kopie[2000]; int anzahl_zeilen = 0; datei = fopen ("textfile", "r"); if(datei == NULL){ printf("Datei konnte nicht geöffnet werden."); } while(fgets(puffer, BUF, datei) != NULL){ //Speicher reservieren... //kopie[anzahl_zeilen] = (char*)malloc(sizeof(kopie)); kopie[anzahl_zeilen] = (char*)realloc(kopie[anzahl_zeilen], 100); if(kopie[anzahl_zeilen]==0) printf("Speicher voll"); strcpy(kopie[anzahl_zeilen], puffer); anzahl_zeilen++; } free(*kopie); printf("Die Datei hat %i Zeilen.\n", anzahl_zeilen); printf("%i Fundestellen.\n", vergleich(kopie, anzahl_zeilen)); }
Es soll eigentlich bestimmte Textstellen finden, aber der Teil soll erstmal außer Acht gelassen werden. Es geht jetzt einfach nur darum, ob die Art und Weise, wie die Zeilen in das Array geschrieben werden, ok ist (Vor allem ReAlloc).
-
Anstatt realloc solltest du in dem Fall wohl besser malloc verwenden. Außerdem würde ich den Speicher, der reserviert werden soll auch auf BUF setzen und nicht nur auf 100! Da kann ganz leicht ein Überlauf stattfinden, besonders weil du danach mit strcpy kopierst. Besser wäre da noch strncpy. Damit riskierst du keinen Überlauf, weil du ja die kopierten Zeichen beschränken kannst auf die Größe deines Char-Arrays.
-
Jo, alles klar. Danke für die Tipps.