Правильное использование Stat on C

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

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

Ответ 1

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

buf = malloc(sizeof(struct stat));

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

free(buf);

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

Вы не выделили какую-либо память для вашего пишущего указателя.

Вы должны выделить память для buf.

buf = malloc(sizeof(struct stat));

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

Ответ 6

Это должно исправить вашу проблему, а другое: размер файла может быть 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.
}