Чтобы убедиться, что у вас нет арифметического переполнения и нет несоответствия строки формата, используйте long long
явно:
unsigned long long num_bytes = sbuf.f_bsize;
num_bytes *= sbuf.f_bavail;
printf("Bytes available: %llu\n", num_bytes);
Пока тип вашего выражения зависит отТипы членов структуры, которые являются typedefs, будет невозможно выбрать правильную строку формата.Поскольку printf
- это varargs, компилятор не будет автоматически преобразовываться в правильный тип.Введение вспомогательной переменной позволяет вам быть абсолютно уверенным в ширине параметра, передаваемого в printf
.
. Также проверьте возвращаемое значение из statvfs
, чтобы убедиться, что эти значения действительно что-то значат.Если вы получили ошибку, она ни на что не годится.