2010-06-29 15 views
10

Perché questo lavoro:Uso corretto della Stat su C

char *fd = "myfile.txt"; 
struct stat buf;   

stat(fd, &buf); 
int size = buf.st_size; 

printf("%d",size); 

Ma questo non funziona:

char *fd = "myfile.txt"; 
struct stat *buf;   

stat(fd, buf); 
int size = buf->st_size; 

printf("%d",size); 
+24

per favore, non usare fd come nome var per qualcosa che non è un descrittore di file. – ninjalj

+3

Se compili con '-Wall -O', riceverai questo avviso da gcc:' warning: 'buf' è usato non inizializzato in questa funzione'. – caf

+0

Sebbene i problemi di allocazione della memoria siano più critici, non dovresti prestare attenzione al contenuto di buf (o alla struttura puntata da buf) finché non sai che 'stat()' è riuscita - che tu determini controllandone il valore ritorna. Se fallisce, il contenuto di buf non ha senso. –

risposta

20

La ragione per questo non funziona è che buf nel primo esempio è assegnato in pila. nel secondo esempio si ha solo un puntatore ad una struct stat, indicando qualsiasi punto (probabilmente indicando per affrontare 0x0, cioè un puntatore NULL), è necessario allocare memoria per così:

buf = malloc(sizeof(struct stat)); 

Poi entrambi gli esempi dovrebbero funzionare Quando si utilizza malloc(), ricordate sempre di utilizzare free() dopo aver terminato con l'utilizzo del struct stat:

free(buf); 
+13

(Ma non dimenticare di 'free()' in seguito.) – Amber

2

Nella seconda, si utilizza un puntatore che punta a voi-dont-sa-dove. stat sarà per caso in grado di riempire correttamente i valori nell'area puntata (il tuo programma potrebbe essere terminato bruscamente qui). Quindi, dato che non hai idea di dove siano questi dati, lo usi buf->st_size ma forse qualcuno ha usato questa area di memoria che non possiedi.

10

È solo un semplice problema di allocazione della memoria.

char *fd = "myfile.txt"; 
struct stat *buf;   

stat(fd, buf); 
int size = buf->st_size; 

printf("%d",size); 

Il codice precedente dichiara solo un puntatore, ma in realtà non è disponibile spazio di memoria.

si dovrebbe modificare il codice per assomigliare a questo:

char *fd = "myfile.txt"; 
struct stat *buf; 

buf = malloc(sizeof(struct stat)); 

stat(fd, buf); 
int size = buf->st_size; 
printf("%d",size); 

free(buf); 

Questo sarà allocare la memoria e la connessione dopo che è stato utilizzato.

1

È una grande differenza tra la creazione di una struttura o un puntatore a una struttura. Il primo codice crea la struttura, il secondo crea un puntatore, in una struttura non esistente. Usando malloc o calloc puoi allocare memoria e la tua struttura verrà inizializzata. Dopo questo fai quello che vuoi e nel momento in cui non hai più bisogno di questa struttura, devi usare la funzione free() per liberare lo spazio allocato.

1

Non è stata assegnata alcuna memoria per il tuo amico di puntatore.

È necessario assegnare memoria a buf.

buf = malloc(sizeof(struct stat)); 

ora funzionerà.

0

Questo dovrebbe risolvere il problema e un altro: la dimensione del file può essere a 32 o 64 bit int. Questo esempio presuppone una macchina a 64 bit.

#include <stat.h> 
#include <errno.h> 

char *file = "myfile.txt"; 
long long size; //st_size can be a 64-bit int. 
struct stat *buf = malloc(sizeof(struct stat)); //allocates memory for stat structure. 
errno = 0; //always set errno to zero first. 

if(stat(file, buf) == 0) 
{ 
    size = buf->st_size; 
    printf("Size of \"%s\" is %lld bytes.\n", file, size); 
} 
else 
{ 
    perror(file); //if stat fails, print a diagnostic. 
} 
+0

stuct = struct . Grazie per il tuo codice. – danger89