問題
在有一次嘗試用stat()函數獲取文件屬性的時候,發現如果直接聲明一個指針,然后把這個指針作為參數傳給函數,會導致函數執行失敗,原代碼:
#include <sys/stat.h> #include <unistd.h> #include <stdio.h> int main(void) { struct stat *sta_1; char pth_1[] = "./c12.txt"; int re = stat(pth_1, sta_1); printf("result = %d\n", re); printf("size = %d\n", sta_1->st_size); }
原因
我猜測是因為聲明指針並不代表在正文創建了這個變量,實際上它只是一個屬於這個類型的指針,並不指向任何變量。所以,但凡用指針傳入函數賦值的情況,必須在程序正文聲明這個變量。
示例代碼1:
int main(void) { struct stat *sta_p; struct stat stat_1; sta_p = &stat_1; char pth_1[] = "./c12.txt"; int re = stat(pth_1, sta_p); printf("result = %d\n", re); printf("size = %d\n", sta_p->st_size); }
示例代碼2:
int main(void) { struct stat stat_1; char pth_1[] = "./c12.txt"; int re = stat(pth_1, &stat_1); printf("result = %d\n", re); printf("size = %d\n", (&stat_1)->st_size); }
另一個案例,從文件讀取內容到buff變量,也是必須在正文聲明一個變量
#include <unistd.h> #include <fcntl.h> #include <string.h> #include <stdio.h> int main(void) { #define BUFFER 4096 char err_1[] = "Opps~an error occurred when copy."; char buf[BUFFER]; short rnum = 0; char copy_1_pth[] = "./c14_copy.dat"; int copy_1_fd = open(copy_1_pth, O_RDWR|O_CREAT, 0777); while((rnum = read(STDIN_FILENO, buf, BUFFER)) != 0){ if(rnum != write(copy_1_fd, buf, rnum)){ write(STDERR_FILENO, err_1, strlen(err_1)); break; } } printf("Okay.\n"); }