인프런 커뮤니티 질문&답변
if(!parr) exit(1); 을 하는 이유에 대해 질문 드립니다.
해결된 질문
작성
·
29
1
안녕하세요. 13.5 강의를 듣고 실습 중에 궁금증이 생겨 질문 드립니다.
FILE* fp = fopen("sample.txt", "rb");
int n = 100;
int* parr = (int*)malloc(sizeof(int)*n);
for (int i = 0; i < n; ++i)
*(parr + i) = i * 2;위와 같이 if(!parr) exit(1); 부분을 빼놓고 코드를 작성하니 "NULL 포인터 parr+i 를 역참조 할 수 없다"고 MSVS에서 표기가 뜹니다.
exit(1)은 프로그램을 종료 시키는 것으로 알고 있었는데 동적할당 메모리 parr이 처음 선언될 때 할당된 메모리의 첫 번째 주소를 리턴 받은게 아니라 NULL로 리턴을 받을 수 있는 가능성이 있어서 MSVS에서 미리 경고를 주는 것일까요?
코드 실행 자체는 잘됩니다.
답변 1
1
안녕하세요? 질문&답변 도우미 durams입니다.
해당 내용이 에러인지 경고인지는 따로 말씀해주시지 않아 확실치 않습니다만, 실행은 된다고 하셨으니 경고(warning)이겠네요. 다만 전체 코드가 없다면 정확히 어떤 상황인지 판단하기 어렵습니다. 또한 해당 경고가 Intellisense의 정적 코드 분석의 결과인지, 컴파일러의 실행 결과인지도 모르겠네요.
해당 코드 자체만으로는 문제가 발생할 여지가 없어보입니다. 100개의 int를 힙 메모리에 할당하는 것 자체는 가벼운 작업입니다. 하지만 OS가 연계되는 모든 작업(힙 메모리 할당 포함)은 함수의 반환값이나 인자 등을 통해 언제나 그 유효성을 확인하는 것이 중요합니다.
Visual Studio에서 테스트하던 중 C언어 표준을 legacy MSVC에서 C11 이상으로 올리니 말씀하셨던 경고를 저도 발견했네요. 컴파일러의 업데이트에 따라, 견고한 프로그래밍을 권장하기 위해 이러한 경고 사항이 추가되기도 합니다.
https://learn.microsoft.com/en-us/cpp/code-quality/c6011?view=msvc-170
말씀하신 경고는 아마 이 링크에 소개되어있는 것 같네요. 'dereferencing하는 포인터가 잠재적으로 NULL일 수 있으니, 사용 전에 유효성을 확인하라' 라고 되어있네요. 원 답변에서 말씀드린 내용과 일맥상통합니다. malloc이 실패할 가능성이 있기 때문이에요.






안녕하세요! 언제나 친절히 답변해 주셔서 감사합니다 🙂 제가 정보를 제대로 전달드리지 못해 보시기에 어려우셨을 수도 있겠네요.
위 코드에서 주석처리 한 부분을 빼면 경고로 "NULL 포인터
parr+i를 역참조 할 수 없다"고 나옵니다.그래서 제가 가진 궁금증은 "
parr이 처음 선언될 때 할당된 메모리의 첫 번째 주소가 아닌 NULL로 리턴을 받을 수 있어서if(!parr) exit(1);를 작성해야 하는 것인가?" 였습니다.