Правильное использование Stat на C - PullRequest
12 голосов
/ 29 июня 2010

Почему это работает:

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

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

printf("%d",size);

Но это не работает:

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

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

printf("%d",size);

Ответы [ 6 ]

25 голосов
/ 29 июня 2010

Причина, по которой он не работает, заключается в том, что buf в первом примере размещается в стеке. Во втором примере у вас есть только указатель на struct stat, указывающий куда угодно (возможно, указывающий на адрес 0x0, то есть указатель NULL), вам нужно выделить для него память следующим образом:

buf = malloc(sizeof(struct stat));

Тогда оба примера должны работать. При использовании malloc() всегда не забывайте использовать free() после того, как вы закончили с использованием struct stat:

free(buf);
10 голосов
/ 29 июня 2010

Это просто проблема выделения памяти.

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

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

printf("%d",size);

Приведенный выше код объявляет только указатель, но в действительности не выделяется место в памяти.

Вы должны изменить код так, чтобы он выглядел так:

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

Это выделит память и освободит ее после использования.

2 голосов
/ 29 июня 2010

Во втором вы используете указатель, указывающий на вас-не-знаю-где. stat случайно сможет правильно заполнить значения в указанной области (ваша программа могла внезапно завершиться). Затем, поскольку вы не знаете, где находятся эти данные, вы используете их buf->st_size, но, возможно, кто-то использовал эту область памяти, которой вы не владеете.

1 голос
/ 29 июня 2010

Вы не выделили памяти для указателя, чувак.

Вы должны выделить память для буфера.

buf = malloc(sizeof(struct stat));

теперь это будет работать.

1 голос
/ 29 июня 2010

Это большая разница между созданием структуры или указателя на структуру. Первый код создает структуру, второй создает указатель на несуществующую структуру. Используя malloc или calloc, вы можете выделить память, и ваша структура будет инициализирована. После этого вы делаете все, что хотите, и в тот момент, когда вам больше не нужна эта структура, вы должны использовать функцию free (), чтобы освободить выделенное пространство.

0 голосов
/ 25 августа 2013

Это должно решить вашу проблему и другое: размер файла может быть 32- или 64-битным int. В этом примере предполагается, что 64-разрядный компьютер.

#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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...