linux stat函数中struct stat * buffer和&buffer有什么区别

时间:2019-05-13 09:51:33

标签: c linux

我正在尝试获取父目录的统计信息。

如果我像下面这样写代码,则返回error: Bad address

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <dirent.h>

int main(int agrc, char * argv[]){
    struct stat *buffer;
    int res = stat("..", buffer);
    if(res != 0){
        perror("error");
        exit(1);
    }
    //printf("%d", buffer->st_ino);

}

但是,如果我在下面编写这样的代码,那就没有问题。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <dirent.h>

int main(int agrc, char * argv[]){
    /* struct stat *buffer; */
    struct stat buffer;
    int res = stat("..", &buffer);
    if(res != 0){
        perror("error");
        exit(1);
    }
    //printf("%d", buffer->st_ino);
    printf("%d", buffer.st_ino);

}

我不知道为什么结果会有所不同。

定义buffer的变量struct stat * bufferstruct stat的指针

&buffer也是struct stat的指针

该功能在手册页中定义如下

SYNOPSIS
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <unistd.h>

       int stat(const char *pathname, struct stat *buf);
       ...

我希望结果都能成功,为什么结果不同?任何人都可以提供帮助,非常感谢。

1 个答案:

答案 0 :(得分:4)

使用struct stat buffer;,在堆栈上为buffer分配了内存。
但是对于struct stat *buffer;,没有为buffer分配内存。您必须使用内存分配功能来分配内存。这种分配发生在所谓的堆上。

struct stat *buffer = malloc(sizeof(struct stat));

请注意,[expr.pre]/4统计path指向的文件并填写buf。因此,如果buf没有指向程序所拥有的内存,它将导致error: Bad address