kkw564   2년 전

이 문제는 인덱스가 1번부터 시작이라

int *dist = (int*)malloc(sizeof(int)*V ); // int dist[V]과 같다.


이 방식은 런타임에러를 유발합니다.


그런데 


int *dist = (int*)malloc(sizeof(int)*V + 1); // int dist[V]과 같다. 


이방식은 통과가 되네요.


원래 정상적인 상황이라면


int *dist = (int*)malloc(sizeof(int)*(V + 1)); // int dist[V]과 같다.


이렇게 해야 인덱스가 1번부터 되어도 괜찮은 부분인데 왜 2번째 코드는 통과가 되는거죠??


알수가없네요

bupjae   2년 전

3번 문장은 C언어 규칙을 잘 지킨 문장이고, 1번 및 2번 문장은 나중에 자신이 사용하기로 약속한 공간을 넘어선 곳을 사용하게 되는데, 이 때 C언어 규칙을 어긴 것이 됩니다.

 C언어 규칙을 어기는 문장의 실행 결과는 정의되어 있지 않습니다. (기술적으로는 Undefined Behavior 라고 부릅니다) 즉, 런타임 에러가 나올 수도 있고, 프로그래머가 전혀 의도하지 않은 엉뚱한 결과가 나올 수도 있고, 정말 우연히 원하는 결과가 나올수도 있고... 어떤 결과 될지는 아무도 모릅니다.



여기까지는 원론적인 이야기

이제부터는 구현 상세 이야기



"대부분의" C언어 구현은 메모리를 동적 할당할 때 블럭 단위로 할당하는 걸로 알려져 있습니다. 예를 들어 8바이트 블럭으로 삼는 구현의 경우 malloc(11)를 요청할 경우 실제로는 16byte 만큼 할당한 후 메모리 주소를 반환하는 식입니다. 그래서 2번 문장의 경우 +1만 더 요청했더라도 내부적으로는 1블럭만큼 더 받을 가능성이 있다는 것입니다.

물론, 이런 블럭 단위 할당을 하지 않는 C언어 구현도 얼마든지 있을 수 있고, 그런 환경에서는 2번 문장도 마찬가지로 성대한 오류를 뿜을 겁니다.

kkw564   2년 전

정말 좋은 답변 감사드립니다 ^^!!

댓글을 작성하려면 로그인해야 합니다.