2013-08-08 1 views
-3

누군가가 내가 왜 이것에 sigsegv지고 오전 말할 수 있습니까?내 strlen 코드 segfaults

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char szInput[256]; 
    printf ("Enter a sentence: "); 
    fgets (szInput, 256, stdin); 

    size_t n = (unsigned)strlen(szInput); 
    printf ("The sentence entered is %ld characters long.\n", n); 
    return 0; 
} 

실행할 때 segfaults.

unix>strlen_ex 
Enter a sentence: foo bar burr 
Segmentation fault 
가 그대로 충돌하지만, 가능성이있는 데 나는 이유를 볼 수 없습니다
+2

실행하는 프로그램이 질문에 입력 한 코드와 동일합니까? 귀하의 질문에 코드에 아무런 문제가 없기 때문입니다. –

+1

Btw, 캐스트가 불필요하며,'strlen'은 이미'size_t'를 리턴합니다. – Nobilis

+0

그리고'% zu'를 사용하여'size_t'를 출력해야하지만, segfault는 발생하지 않아야합니다. –

답변

0

...

그것은이 실수로 잘못을 얻기에서 당신을 방지하는 대신 명시 적으로 256의 sizeof szInput을 통과하는 것이 가장 좋습니다 크기는 fgets입니다. 당신이 8 바이트의 배열을 설정하면 예를 들어

char szInput[256]; 
printf ("Enter a sentence: "); 
fgets (szInput, sizeof szInput, stdin); 

는 256에서 fgets 전화를두고 "안녕하세요!"를 입력 :

char szInput[8]; 
printf ("Enter a sentence: "); 
fgets (szInput, 256, stdin); 

이 후는 fgets 호출 szInput의 끝을지나 작성합니다. 스택에 있기 때문에 중요한 항목 (예 : fgets 스택 프레임)을 덮어 쓸 수 있습니다. 그렇다면 실제로 segfault (또는 어쨌든 실패)합니다.