» »

[C] malloc, sigsegv

[C] malloc, sigsegv

čuhalev ::

Torej imam spodnjo kodo, vendar ne vem, čemu mi malloc v nekaterih primerih povozi vrednost v vector->count
typedef struct vector {
	void ** content;
	unsigned int size;
	unsigned int count;
} vector;

int size = 5;
vector *vector = malloc(sizeof(vector));

if (vector != NULL) {
   vector->count = 0;
   vector->content = malloc(size * sizeof(void*));
}
Uporabljam MinGW-4.8.1 Potem pa se mi povsem nedeterministično ob enakih začetnih podatkih usuje SIGSEGV pri
if (vector) {
      if (vector->content)
         free(vector->content);
      free(vector);
   }

Randomness ::

Zakaj imaš ime spremenljivke enako kot ime tipa?

mn ::

Kakor vidim je tvoj problem, da je spremenljivka "void** content" pointer na pointer. Potem pa ji dodeliš pointer na buffer namesto pointer na pointer ki kaže na buffer. Spremeni deklaracijo "void** content" v "void* content".

Randomness ::

@mn: Ne, saj sem že zgoraj napisal, kaj je problem. Ime spremenljivke in ime tipa je enako in klic malloc ne naredi to, kar jaakaa misli, da naredi. V njegovem primeru namreč sizeof(vector) vrne enako kot sizeof(struct vector *), on pa seveda želi reči sizeof(struct vector). Če bi ime spremenljivke bilo različno od imena tipa, na ta problem seveda ne bi naletel. No, po drugi strani pa se na napakah učimo in bo jaakaa drugič bolj pazljiv. Upam le, da ni pri tem svojem početju nehote sprožil kakšnih jedrskih konic ;-)

Zgodovina sprememb…

čuhalev ::

Ja, sem preimenoval in dela, samo mi je zanimivo, da se je včasih program izšel, naslednjič ne.

Randomness ::

Ja, sem preimenoval in dela, samo mi je zanimivo, da se je včasih program izšel, naslednjič ne.
Tak in podobni odgovori me vedno zmotijo in nakazujejo na to, da avtor odgovora stvari ne razume dovolj dobro in se mu hkrati ne ljubi potruditi, da bi poskušal svoje razumevanje izboljšati.

Andrej4 ::

čuhalev je izjavil:

Ja, sem preimenoval in dela, samo mi je zanimivo, da se je včasih program izšel, naslednjič ne.


Podobno kot, če poskušaš zliti preveč vode v premalo posodo. Vedno malo ven špricne. Včasih tebi v oko, včasih pa lahko tudi komu, ki povsem slučajno pride mimo.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C in funkcije ter #define

Oddelek: Programiranje
463953 (2314) misek
»

[C++] problem z binarnimi datotekami

Oddelek: Programiranje
9950 (815) mallard
»

[C] kazalčni seznam

Oddelek: Programiranje
123101 (2915) MrBrdo
»

[c++] Pomoč pri izdelavi std::vector "wrapperja"

Oddelek: Programiranje
81586 (1487) zhigatsey
»

kazalci in polje

Oddelek: Programiranje
51679 (1600) rasta

Več podobnih tem