NULL과 \0의 관계

C & C++ 관련 : 2008. 4. 17. 22:03
반응형
#include<stdio.h>
main (){
 char a[1]={'\0'};
 printf("%c\n",a[0]);
 (a[0]==NULL)?printf("yes"):printf("no");
}

답은 Yes

하지만.
\0은 문자열의 끝을 나타내고
NULL은 아예 없는것을 나타낸다고 그러네....
반응형

'C & C++ 관련' 카테고리의 다른 글

신기한 C 프로그래밍~  (2) 2008.04.30
NULL과 \0의 관계  (3) 2008.04.17
C의 && || 연산  (2) 2008.04.17
popen  (0) 2008.02.11
Posted by Real_G

댓글을 달아 주세요

  1. 지금은 잘 작동하지만 나중에 어떻게 작동할지 모르는 위험한 코드 중에 하나 입니다. 일단 a[0]에는 garbage값(초기화 되지 않은)이 있는데 우연히 0x00 == NULL == '\0' 이 들어 있어서 저렇게 실행 된것입니다.

  2. 아 a[2]로 착각을 했네요 ^^;
    초기화는 맞는데 저렇게 1개짜리 1차원 배열은 생각을 안해보고 살아서 말이죠 ^^; 그럼 char은 1차원 배열이자 1개인건가요 ㅎ
    컴파일러 내부에서 어떻게 변환될지는 모르겠지만
    결론만 말씀드리자면 0x00 == NULL == '\0' 이고, 단지 문자열의 끝은 0x00 으로 구분 짓자라고 약속을 하고 쓰기 때문에 통상 NULL 문자를 '문자열'에서 사용 하는 것입니다만, 문자열이라고 해서 반드시 0x00으로 끝난다는 보장이 없으므로 안전한 프로그램을 위해서라면 예상되는 문자열의 길이 전부를 복사 한다거나(memcpy이용) 하는 방법을 추천드립니다.

    예를 들어 str[20] 인데 20글자의 문자가 들어 가면 '\0'은 str[20]에 들어 가므로 일종의 buffer overflow 발생을 합니다. 운이 좋아서 str[21] 에 '\0'이 존재 한다면 멈추겠지만, 최악의 경우 시스템을 다운 시킬수도 있기 때문이죠(제가 자주 하는 실수더라구요 ^^;)

    조금더 사족을 붙이자면, 배열은 곧 포인터고, 변수는 단지 데이터를 어떻게 해석하냐의 방법을 제공하는 것입니다. 나중에 어느정도 익숙해지시면 a[0] 이나 *(&a + 0) 이나 결국에는 별 구분 없이 사용하시는 모습을 보게 될겁니다 (예언 ? ㅋㅋ)

    아직 마음에 들지 않는 문서라서 수정중이지만 링크 걸고 갑니다 ^^
    http://blog.naver.com/morpheuz82/130028829555