В чем разница между struct stat * buffer и & buffer в функции linux stat - PullRequest
1 голос
/ 13 мая 2019

Я пытаюсь получить статистику родительского каталога.

Если я напишу код, подобный приведенному ниже, он вернет 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);

}

Iне знаю, почему результат отличается.

Переменная buffer определения struct stat * buffer является указателем struct stat

&buffer также является указателем struct stat

Функция определена, как показано ниже в man-странице

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

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

Я ожидал, что результат будет успешным, почему результат отличается?любой может помочь, большое спасибо.

1 Ответ

4 голосов
/ 13 мая 2019

При struct stat buffer; в стеке выделяется память для buffer.
Но при struct stat *buffer; памяти не выделяется buffer.Вы должны использовать функцию выделения памяти для выделения памяти.Это распределение происходит для так называемой кучи.

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

Обратите внимание, что stat() определяет файл, на который указывает path, и заполняет buf.Так что если buf не указывает на память, которой владеет программа, это приведет к error: Bad address.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...