2013-04-17 5 views
0

내가 내 /파일 시스템은

int main() 
{ 
    struct statfs *stat; 
    statfs64("/tmp",stat); 
    perror(""); 
    printf("%lu \n",stat->f_bfree*stat->f_bsize); 
    return 0; 
} 

perror는의 디스크 사용량을 찾으려면 다음 코드를 사용 통계 "나쁜 주소"와 크기에 대한 임의의 숫자를 인쇄에 유지합니다.

Bad address

3264987920

PS : 나는 sudo ./a.out을 시도, statfs("a.out",stat)

무슨 문제가 될 수있다?

답변

3

statfs 구조체에 대한 포인터를 선언했지만 해당 구조체에 실제로 할당 된 공간이 없습니다. 포인터가 아무데도 가리킨다. 초기화되지 않았으므로 어디서나 합법적이지 않습니다.

struct statfs stat; 

if (statfs64("/tmp", &stat) == -1) { 
    perror("statfs64"); 
} 
else { 
    printf("%lu\n", stat.f_bfree * stat.f_bsize); 
} 
+0

Thanks :) that worked :)'statfs64'는 세그먼트 화 오류를 유발할 수 있으며, 대신 statfs를 사용하여 제거 할 수 있습니다. – rjv

+0

@RajeevS Right. 'statfs()'와'struct statfs'를 함께 사용해야하고'statfs64()'와'struct statfs64'도 사용해야합니다. 후자의 사용은 더 이상 사용되지 않습니다. 올바른 기호가 정의되면'statfs()'대신에 사용됩니다. – glglgl

0

당신이 사용하고 statfs *이없는 메모리 할당과 합계 그러므로 야생 포인터 사용은 어느 곳 (불법 메모리 주소)를 가리킬 수 유효 메모리를 초기화한다 또는 변수 사용 및 참조를 전달 하나.

+0

당신은 [존이 당신보다 7 시간 반 전에 말한 것과 똑같이 말하고 있습니다 ...] (http://stackoverflow.com/a/16050052/296974) – glglgl