2010-06-29 59 views
10

正確使用統計的爲什麼這項工作:基於C

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

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

printf("%d",size); 

但是,這並不工作:

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

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

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

請不要使用fd作爲var名稱,而不是文件描述符。 – ninjalj 2010-06-29 07:39:00

+3

如果使用'-Wall -O'進行編譯,則會從gcc獲得此警告:'warning:'buf'在此函數中未使用初始化。 – caf 2010-06-29 08:43:19

+0

儘管內存分配問題是最關鍵的,但在知道'stat()'成功之前,您不應該注意buf的內容(或buf指向的結構),您可以通過檢查其值回報。如果失敗了,buf的內容就沒有意義了。 – 2010-06-29 13:58:31

回答

20

它的原因不工作是在第一個例子是BUF被分配在堆棧上。 在第二個例子中,你只需要一個指向一個struct stat中,指向任何地方(可能指向地址0x0,即一個NULL指針),你需要爲它分配內存是這樣的:

buf = malloc(sizeof(struct stat)); 

然後,兩個例子應該工作。當使用malloc(),永遠記住使用free()您與使用struct stat結束後:

free(buf); 
+13

(但是不要忘了'免費()'它之後。) – Amber 2010-06-29 07:21:01

2

在第二,你用一個指針指向你,不要,知道,在哪裏。 stat將偶然能夠正確填充指定區域中的值(您的程序可能在此突然終止)。然後,因爲您不知道這些數據的位置,所以您可以使用它buf->st_size但也許有人使用了您不擁有的這個內存區域。

10

這只是一個簡單的內存分配問題。

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

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

printf("%d",size); 

上面的代碼只聲明瞭一個指針,但實際上並沒有分配內存空間。

您應該修改代碼看起來像這樣:

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); 

這將分配內存,並免費使用它之後。

1

創建結構或指向結構的指針是一個很大的區別。第一個代碼創建結構,第二個代碼創建一個指針,指向一個不存在的結構。使用malloc或calloc你可以分配內存,你的結構將被初始化。之後,你可以做任何你想做的事情,而當你不再需要這個結構的時候,你必須使用free()函數釋放分配的空間。

1

你還沒有爲你的指針傢伙分配任何內存。

您應該爲buf分配內存。

buf = malloc(sizeof(struct stat)); 

現在它會工作。

0

這應該解決您的問題和另一個問題:文件大小可以是32位或64位int。這個例子假定一個64位機器。

#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 =結構。 感謝您的代碼。 – danger89 2015-04-23 15:48:43