2014-03-01 1 views
0

오늘의 아침 (정말 놀랐어요.)왜 char 포인터가 세그먼테이션 결함을 제공하지 않습니까? 난 그냥 C의 동작 놀라게 가지고

내가 이런 코드를 작성하는 경우 : 내가 그것을 때문에 세그먼트 오류를 ​​줄 것이라는 점을 알고있다 그리고

char *txt; 
strncpy(txt,"hello",4); 
printf("%s\n",txt); 

을 나는 'txt'포인터에 메모리를 할당하지 않았다. ?

char *txt = (char *) calloc(0,sizeof(char)); 
strncpy(txt,"hello",4); 
printf("%s\n",txt); 
여전히

내가 'TXT'0 바이트를 할당 한하지만 세그먼트 오류를 ​​포기하지 않을 이유 난 그냥 놀랐있어이 대신 세그먼트 오류를주는, 그것이 : 확인 .... 이제이 코드를 참조 정답은 "지옥"입니다.

누구나 저 같은 유형의 C 동작을 설명 할 수 있습니까?

+0

'free (txt)'를 호출하여 무슨 일이 일어나는 지보십시오 ... – pat

+0

m은 무료로 (txt)를 호출 할 때 모든 것이 잘되고 있습니다. 오류가 오지는 않으며 정답을주고 있음을 의미합니다. @가볍게 두드리기 – sdream

답변

0

내가 운영 체제가 실제로 요구 된 바이트 수보다 더 많은 할당하고 그에게 쓰고있어, 또는 운영 체제가 세그먼트 폴트가 발생하지 않습니다 일부 포인터를 반환 것으로 추측한다.

크기가 0 인 경우 http://en.cppreference.com/w/cpp/memory/c/calloc 따르면

는 동작이 정의 된 구현 (NULL 포인터를 리턴 할 수 있고, 또는 몇몇 비 - 널 포인터 저장소를 액세스하기 위해 사용되지 않을 수 복귀 될 수있다)

분명히 이 아니라이 이에 의존해야합니다.

1

세그 폴트는 이 아니며 C 표준이 보장되지 않습니다. 일반적으로 "정의되지 않은 동작"이 있습니다. X를 수행하면 아무 것도 일어나지 않습니다. 때때로, 일부 운영 체제에서는 segfault를 얻게됩니다. 그러나 어쩌면 당신은 "행운"을 얻고 나쁜 일은 일어나지 않을 것입니다. 또는 조금 나중에 사용하게 될 메모리가 손상되어 분명한 이유없이 프로그램이 중단 될 수 있습니다.

이 경우 정의되지 않은 동작은 할당하지 않은 메모리에 쓰면 발생합니다. 어쩌면 작동 할 수도 있고 그렇지 않을 수도 있습니다.

관련 문제