2014-09-14 3 views
1

Этот очень простой C-код компилируется и запускается, но он segfaults, когда он заканчивается. Я не могу понять, почему.Почему эта простая C-программа segfault?

#include <sys/types.h> 
#include <sys/statfs.h> 
#include <stdio.h> 

int main(int argc, char **argv) { 

     struct statfs sf; 

     if (stat(argv[1], &sf) == 0) { 
       printf("Statfs succeeded!\n"); 
       printf("\tFs type:\t %#lx\n", sf.f_type); 
       printf("\tTotal blocks:\t %lu\n", sf.f_blocks); 
       printf("\tFree blocks:\t %lu\n", sf.f_bavail); 
       printf("\tinodes:\t %lu\n", sf.f_files); 
     } else { 
       printf("Statfs failed!\n"); 
       return 1; 
     } 

     return 0; 
} 

компилировать и запускать:

[[email protected] ~]# gcc statfs-test.c -o statfs-test 
[[email protected] ~]# ./statfs-test /dev/sda1 
Statfs succeeded! 
    Fs type:  0x5 
    Total blocks: 1 
    Free blocks:  6 
    inodes: 2049 
Segmentation fault (core dumped) 

Это думаю, что проблема связана с statfs не STRUCT будучи освобожденным, но я не уверен. Нет никакого segfault, если я запустил его для случая сбоя.

+2

Это должно быть 'struct stat', а не' struct statfs', я думаю. –

+1

@AlexFarber: 'stat' использует' struct stat', 'statfs' использует' struct statfs', см. [Man page] (http://man7.org/linux/man-pages/man2/statfs.2.html) –

+1

@MOehm: правый, но код в вопросе использует 'stat' с' struct statfs' –

ответ

2

Изменить

if (stat(argv[1], &sf) == 0) { 

в

if (statfs(argv[1], &sf) == 0) { 

и вы должны быть хорошо.

Как прокомментировал n.m., используйте опцию компилятора -Wall для раннего обнаружения неприятных ошибок.

Смежные вопросы