Правильное использование 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.
}