01/05/06 12:49
ste_funk
Allora ragazzi.. volevo discutere un attimo sull'allocazione dinamica della memoria (malloc(), calloc(), blabla..) e del modo in cui il compilatore gestisce il tutto.
Analizziamo il seguente codice:
-----------------------------------------
-----------------------------------------
Teoricamente dovrebbe darmi un errore di Segmentatio Fault (o sbaglio?) all'inserimento di una stringa maggiore di 5 caratteri, cioè non possibile da contenere nell'array pnt[5].
Invece, compilando con Gcc sotto Linux, il programma accetta stringhe lunghe n senza andare in errore.
Primo quesito: dite che dipenda dal compilatore che utilizzo?
Secondo codice:
-----------------------------------------
-----------------------------------------
Compilo senza problemi incuriosito dal risultato di prima, credendo magari in un ridimensionamento eseguito dal compilatore senza che io ne sappia nulla. A prima vista anche questo codice dovrebbe portare in errore, ma eseguendo ho notato questa cosa:
inserendo n caratteri, con 1 <= n <= 6 e cioè contenuti tra pnt[0] e pnt[5], il printf() mi restituisce solo un (null), senza nessuno errore. quando inserisco 7 o più caratteri e la posizione pnt[6] viene (teoricamente) riempita, mi ritorna un Segmentation Fault.
Secondo quesito: Perchè il compilatore, o il programma in esecuzione, non mi avverte prima di questa posizione non dichiarata (pnt[6])?
Gli stessi dubbi mi vengono con questo codice, modificato di poco, ma simile:
-----------------------------------------
-----------------------------------------
Malloc alloca una zona di memoria definita per dimensioni dall'utente e restituisce un puntatore al primo byte di essa, correggetemi se sbaglio. Però anche qui non vi sono problemi se sforo da questa area dimensionata, mentre io pensavo di causare un errore.
Per non allungare troppo il post, aggiungerò dopo la seconda parte.
Analizziamo il seguente codice:
-----------------------------------------
#include <stdio.h> char pnt[5]; int main(){ scanf("%s", pnt); printf("\nhai inserito: %s\n", pnt); return 0; }
-----------------------------------------
Teoricamente dovrebbe darmi un errore di Segmentatio Fault (o sbaglio?) all'inserimento di una stringa maggiore di 5 caratteri, cioè non possibile da contenere nell'array pnt[5].
Invece, compilando con Gcc sotto Linux, il programma accetta stringhe lunghe n senza andare in errore.
Primo quesito: dite che dipenda dal compilatore che utilizzo?
Secondo codice:
-----------------------------------------
#include <stdio.h> char pnt[5]; int main(){ scanf("%s", pnt); printf("\nhai inserito: %s\n", pnt[6]); return 0; }
-----------------------------------------
Compilo senza problemi incuriosito dal risultato di prima, credendo magari in un ridimensionamento eseguito dal compilatore senza che io ne sappia nulla. A prima vista anche questo codice dovrebbe portare in errore, ma eseguendo ho notato questa cosa:
inserendo n caratteri, con 1 <= n <= 6 e cioè contenuti tra pnt[0] e pnt[5], il printf() mi restituisce solo un (null), senza nessuno errore. quando inserisco 7 o più caratteri e la posizione pnt[6] viene (teoricamente) riempita, mi ritorna un Segmentation Fault.
Secondo quesito: Perchè il compilatore, o il programma in esecuzione, non mi avverte prima di questa posizione non dichiarata (pnt[6])?
Gli stessi dubbi mi vengono con questo codice, modificato di poco, ma simile:
-----------------------------------------
#include <stdio.h> #include <stdlib.h> char *pnt; int i; int main(){ pnt=(char *)malloc(5*sizeof(char)); scanf("%s", pnt); for(i=0; i<10; i++) printf("\nhai inserito: %c\n", pnt[i]); return 0; }
-----------------------------------------
Malloc alloca una zona di memoria definita per dimensioni dall'utente e restituisce un puntatore al primo byte di essa, correggetemi se sbaglio. Però anche qui non vi sono problemi se sforo da questa area dimensionata, mentre io pensavo di causare un errore.
Per non allungare troppo il post, aggiungerò dopo la seconda parte.
Ultima modifica effettuata da ste_funk 01/05/06 17:40
aaa