1. 程式人生 > >[C]關於函式指標引數的賦值

[C]關於函式指標引數的賦值

問題

在有一次嘗試用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");
}