Kezdőoldal » Számítástechnika » Programozás » Előre ismeretlen hosszúságú...

Előre ismeretlen hosszúságú stringet olvasok be egy fájlból C-ben, mit rontottam el?

Figyelt kérdés

Egy függvény olvasná be a stringet, a függvény paraméterei a bemeneti file és a string amibe bele akarom olvasni.


#include <stdio.h>

#include <stdlib.h>


//Stringet beolvasó fgv

void readString(FILE* f, char **str){

char tmp; //Segédváltozó

int len = 0; //A string hossza


//Karakterenként beolvasom és realloc-olom

while((tmp = fgetc(f)) != EOF){

*str = realloc(*str, len++*sizeof(char));

*str[len-1] = tmp;

}

//A legvégére a lezáró 0-t beillesztem

*str = realloc(*str, len++ * sizeof(char) );

*str[len-1] = 0;

}


int main(){

char *s = NULL;

FILE* in = fopen("be.txt","r");


readString(in, &s);

printf("%s\n", str);


fclose(in);

free(str);

return 0;

}


Néztem valgrind-el is hogy mit ronthattam el de egyszerűen csak egy "Invalid write of size 1" hibát dobott... nem sikerült a realloc? Nem értem miért, elvi hiba szerintem nincs benne, talán a pointerekbe kavarodtam össze valahol, de nem tudom hol.

Előre is kösz a segítséget, és nézzétek el ha valami triviális kezdőhibát vétettem (valószínű igen), tapasztalatlan vagyok még a C-ben :)



2017. nov. 20. 14:55
 1/4 A kérdező kommentje:
A printf-nél meg a free-nél elrontottam a paramétert, nem str hanem s, az eredeti kódban azt nem írtam el.
2017. nov. 20. 14:57
 2/4 anonim ***** válasza:

*str = realloc(*str, len++*sizeof(char));


Ha char*-nak definialtad str-t, akkor azt kell atadni.

Valamint az elso lepesben 0 meretu tombot probalsz foglalni, amikor 1 meretu kellene.


str = realloc(str, ++len*sizeof(char));

2017. nov. 20. 16:56
Hasznos számodra ez a válasz?
 3/4 A kérdező kommentje:
Köszi :)
2017. nov. 20. 20:22
 4/4 anonim ***** válasza:
100%
Egyébként a rengeteg realloc nem egészséges, esetleg ha van rá szabad kapacitás, megcsinálhatnád úgy, hogy nagyobb egységeket foglalsz le, mondjuk 50 bájt senkinek nem fáj egy mai ramon, és 50 karakterenként reallocolsz csak, amikor megtelt a jelenlegi. De ez már csak mikro-optimalizáció, nem lényeges, csak még jól jöhet a jövőben, például ha több százezer karakteres a fájl, akkor minden egyes betű után végigpakolja az összes betűt ide-oda a memóriában.
2017. nov. 21. 17:38
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!