2010-06-29 34 views
10

Tại sao công việc này:sử dụng đúng của Stat trên C

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

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

printf("%d",size); 

Nhưng điều này không làm việc:

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

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

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

vui lòng không sử dụng fd làm tên biến cho thứ không phải là bộ mô tả tệp. – ninjalj

+3

Nếu bạn biên dịch bằng '-Wall -O', bạn sẽ nhận được cảnh báo này từ gcc:' warning: ‘buf’ được sử dụng uninitialized trong hàm này'. – caf

+0

Mặc dù vấn đề cấp phát bộ nhớ là quan trọng nhất, bạn không nên chú ý đến nội dung của buf (hoặc cấu trúc được chỉ ra bởi buf) cho đến khi bạn biết rằng 'stat()' đã thành công - bạn xác định bằng cách kiểm tra giá trị trả về. Nếu nó thất bại, nội dung của buf là vô nghĩa. –

Trả lời

20

Lý do nó không làm việc là buf trong ví dụ đầu tiên được cấp phát trên ngăn xếp. Trong ví dụ thứ hai bạn chỉ có một con trỏ đến một struct stat, trỏ đến bất cứ nơi nào (có lẽ chỉ để giải quyết 0x0, tức là một con trỏ NULL), bạn cần phải phân bổ bộ nhớ cho nó như thế này:

buf = malloc(sizeof(struct stat)); 

Sau đó, cả hai các ví dụ sẽ hoạt động. Khi sử dụng malloc(), hãy luôn nhớ sử dụng free() sau khi bạn đã kết thúc với việc sử dụng struct stat:

free(buf); 
+13

(Nhưng đừng quên 'free()' sau đó.) – Amber

2

Trong thứ hai, bạn sử dụng một trỏ trỏ đến bạn-dont-bí quyết ở đâu. stat sẽ tình cờ có thể điền chính xác các giá trị trong khu vực được chỉ định (chương trình của bạn có thể đã kết thúc đột ngột tại đây). Sau đó, vì bạn không có ý tưởng về nơi dữ liệu này được, bạn sử dụng nó buf->st_size nhưng có thể ai đó đã sử dụng khu vực bộ nhớ này mà bạn không sở hữu.

10

Nó chỉ là một vấn đề phân bổ bộ nhớ đơn giản.

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

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

printf("%d",size); 

Mã trên chỉ khai báo một con trỏ, nhưng trên thực tế, không có bộ nhớ được phân bổ.

bạn nên thay đổi mã để trông như thế này:

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

này sẽ phân bổ bộ nhớ, và miễn phí sau khi nó được sử dụng.

1

Đó là sự khác biệt lớn giữa việc tạo cấu trúc hoặc con trỏ đến cấu trúc. Mã đầu tiên tạo ra cấu trúc, thứ hai tạo ra một con trỏ, đến một cấu trúc không tồn tại. Sử dụng malloc hoặc calloc bạn có thể cấp phát bộ nhớ và cấu trúc của bạn sẽ được khởi tạo. Sau này bạn làm bất cứ điều gì bạn muốn và tại thời điểm này khi bạn không cần cấu trúc này nữa, bạn phải sử dụng hàm free() để giải phóng không gian được phân bổ.

1

Bạn chưa cấp phát bộ nhớ cho con trỏ của mình.

Bạn nên cấp phát bộ nhớ cho buf.

buf = malloc(sizeof(struct stat)); 

bây giờ nó sẽ hoạt động.

0

Điều này sẽ khắc phục sự cố của bạn và vấn đề khác: kích thước tệp có thể là int 32 hoặc 64 bit. Ví dụ này giả định một máy 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 . Cảm ơn mã của bạn. – danger89

Các vấn đề liên quan