PDA

Visualizza la versione completa : [C] Funzione malloc(): allocare 5 byte ma ne contiene di più


torn24
23-02-2012, 10:36
ciao, ho un incompresione sulla funzione malloc , e un problema con sizeof.

nel codice alloco dinamicamente , in un puntatore a char 5 byte , poi con strcpy gli "inserisco" una striga più lunga di 5 caratteri , non da nessun errore e funziona come
se la potesse contenere , ma dove viene salvata la stringa ? io mi aspetterei
un errore e il blocco del programma !
vorrei visuallizzare quanti byte sono stati allocati ,prima tramite la funzione malloc , poi
dopo la funzione relloc , avevo pensato a sizeof(puntatore) o sizeof(*puntatore) ,
ma mostrano lo stesso numero di byte , qualunque sia la quantità di memoria allocata!

se può essere utile , utilizzo ide devc++.




#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
char *x;

char parola[]="parola_molto_lunga";

x=(char*)malloc(sizeof(char)*5);

//printf("byte allocati in x %d\n",sizeof(x));

//come visuallizare quanti byte sono stati allocati ??

strcpy(x,parola); //perche x può contenere più di cinque caratteri ?

puts(parola);

/*
x=(char*)relloc(x,sizeof(char)*20);

printf("byte allocati in x %d\n",sizeof(x));

*/
system("PAUSE");
return 0;
}

ardito86
23-02-2012, 11:00
come visuallizare quanti byte sono stati allocati ??

Non puoi, devi saperlo tu (del resto non c'è motivo di saperlo: se allochi tu la memoria, lo sai già).
Nel tuo caso stai tranquillo che vengono allocati 5byte, ma il fatto che il programma ti giri lo stesso se metti una parola più lunga non significa nulla, magari lo fai girare in un altro computer o un'altra piattaforma e ti da errore.
Non sai cosa succede all'avvio del programma, quanta memoria chiede il programma prima dell'avvio...dipende dal compilòatore, dal sistema operativo...


Quanto a sizeof(puntatore) o sizeof(*puntatore), il primo ritorna la dimensione in byte per memorizzare unpuntatore (ovvero la stessa dimensione di un int), mentre il secondo ti da la dimensione di 1byte, ovvero il primo char puntato.

oregon
23-02-2012, 11:00
Originariamente inviato da torn24
nel codice alloco dinamicamente , in un puntatore a char 5 byte , poi con strcpy gli "inserisco" una striga più lunga di 5 caratteri , non da nessun errore e funziona come
se la potesse contenere , ma dove viene salvata la stringa ? io mi aspetterei
un errore e il blocco del programma !

Come detto in altri thread (anche recentemente) quando un programma C scrive in memoria possono accadere 3 fatti:

1) tutto ok, la memoria è correttamente allocata al processo ed è destinata a quello che il programmatore aveva previsto

2) la memoria è allocata al processo ma destinata ad altro e comunque il programma ci può scrivere distruggendo dati (o parti dello stack)

3) la memoria non è allocata al processo, hai un crash

Evidentemente il caso 2) è quello che ti sta accadendo.

torn24
23-02-2012, 11:29
Crazie a tutti , per le risposte !
Da quel che ho capito , è un caso che funzioni correttamente .


della serie "se funziona , non vuol dire che non hai commesso errori ! " :sadico:

oregon
23-02-2012, 11:31
Originariamente inviato da torn24
Da quel che ho capito , è un caso che funzioni correttamente .





della serie "se funziona , non vuol dire che non hai commesso errori ! "

Sono gli errori peggiori ... se hai un crash, sei fortunato.

ardito86
23-02-2012, 12:45
Originariamente inviato da oregon

Sono gli errori peggiori ... se hai un crash, sei fortunato.
eh già :mem:

Loading