[C언어] 0과 NULL값의 비교
글쓴이: akrnldytpq / 작성시간: 수, 2009/04/22 - 3:10오후
제가 프로그램을 공부한지 얼마 안되서요..
질문 하나 드릴꼐요
unsigned char buff[10] = {0x11, 0x12, 0x00, 0x03, 0x05};
int i=0;
i = strlen(buff);
또는
while(buff[i] != NULL)
i++;
이렇게 했더니 i값은 2가 나오더군요.
데이터의 존재 유무를 기준으로 NULL 과 0x00은 비교되야 한다는 사실은 알고 있습니다.
근데 막상 코딩으로 짜볼라니까 잘 안되네요..
NULL 값을 어떻게 비교해야 다음 배열 번지로 넘어갈수 있을까요??
isNull 이라는 함수를 예전에 사용했었던거 같은데 C 레퍼런스에 보니까 안나와있어서 염치불구하고 고수님들께 여쭤봅니다.
도와주세요 ㅠ.ㅠ
Forums:
무슨 뜻인지
무슨 뜻인지 모르겠습니다. NULL은 0입니다.
하시고자 하는게 뭔지?
데이터를 넣은 배열의 크기를 알고 싶으신건가요?
strlen은 문자열의 길이를 알려주는 겁니다.
문자열은 NULL로 끝나니, 2가 나오는게 맞고요.
데이터를 넣은 배열의 길이를 아는 방법은 없습니다.
strlen은 0의 위치를
strlen은 0의 위치를 찾는 함수고 (C 에서의 string은 NULL terminated string이죠.) 작성하신 코드도 그렇다보니 당연히 2가 나오는 겁니다.
--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
NULL값은 0이지만..
NULL값은 0이지만 현재 buff라는 배열에는 5개의 값이 들어가있자나요..
저 상황에서 buff라는 배열의 길이를 구하면 5라는 값이 나와야 하는데..
2라는 값이 나와서 여쭤본거에요 ㅠ.ㅠ
소스를 어떻게 고쳐야 배열원소의 개수가 5개로 나오는가 라는 질문이예요 ㅠ.ㅠ
sizeof(buff)/sizeof(buff[0])
sizeof(buff)/sizeof(buff[0]) 와 같이 하면 5가 나올것입니다.
참고로 이것은 buff가 '배열이름'인 경우에만 가능합니다.
포인터에 대해서는 따로 기록해두지 않는 한 알아내는 방법은 없습니다.
10 이
10 이 나오겠죠.
질문하신 님이 원하는 것은 5 이고.
공간의 크기(혹은 갯수)에 대한 질문이 아니라
값을 넣은 것과 넣지 않은 것을 구별할 방법을 묻는 질문 같습니다.
OTL
아 그렇네요.
아 그렇네요. 다섯개만 들어있길래 다섯개짜린줄 알았더니 10개짜리였군요.
선배님들..
그럼 저 상황에서 데이터를 넣은 배열의 길이를 알아내는 함수는 없는건가요??
없습니다.
없습니다.
감사합니다 선배님~
아 속이 시원하네요..
차라리 기록을 하는 방법으로 가야 되겠어요 ㅠ.ㅠ
저는 방법이 있는줄 알고 벌써 2시간째 소스를 몇번을 고쳐봤는지... ㅠ.ㅠ
여튼 감사합니다~
약간 오해의 소지가 있는 것 같아서...
C의 문자열이 "Null-terminated string"이라고 말할 때의 그 "Null"은 "Null 포인터" 할 때의 그 NULL이 아니라, 그냥 아스키 코드 0입니다. 보통 NUL이라고 더 자주 쓰죠. (아스키 코드 0은 NUL, 10은 LF, 13은 CR...)
즉 C의 문자열이 "Null-terminated"라는 뜻은 "마지막에 NULL 포인터가 들어있다!"가 아니라 "마지막에 아스키 코드 0, 즉 값이 0인 바이트가 들어있다!"라는 뜻입니다.
물론 C 컴파일러 입장에서는 NULL도 숫자 0이고 아스키 코드 0도 숫자 0이므로 같습니다. -_-;;;
http://en.wikipedia.org/wiki/Null_character
http://en.wikipedia.org/wiki/ASCII (중간쯤에 테이블 있음)
제가 생각하기에 C가 최악인 부분이 이부분인 것 같아요.
물론 C 언어의 역사를 생각하면 이해할 수 있기는 한데 현대로 오면서 C 언어를 보다 고급의 타입이론으로 C 탄생 시절의 어셈블리 래퍼의 의미를 이해할려면 혼돈만 오는게 아닌가 싶습니다.
전둘다 0인게
전둘다 0인게 마음에들고 아예 표준에서 둘은 완전히 동일하고 무조건 0이다라 고 못박아줬으면하는데요...
아마 처음에는 그랬겠죠.
이식성을 위해서 표준에서 bit 표현이 다를 수 있음을 받아들인걸테고요.
최소한 C99에서는
최소한 C99에서는 NULL이랑 NUL의 bit 표현이 0이어야 한다는 내용이 있었던 거 같습니다.
----
Let's shut up and code.
----
Let's shut up and code.
the c++ programming
the c++ programming language를 보면 Stroustrup이 NULL 쓰지 말고 0 쓰라는 비슷한 이야기를 하고 있습니다.
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
우선
우선 NULL 과 null character 의 구분이 있어야 할 것 같습니다.
어떤 상황에서 초기화한 값의 개수를 아는 것이 필요한지 전혀 감이 안오네요.
character 의 집합에서 null character 가 나온다면 그 이후의 문자들은 아무 쓸데가 없는 것이 되거든요? 보통의 경우에서는요.
요는 NULL 과 null character 는 전혀 다르다는 것과 현재 님이 하고 계신 상황이 보통(정상)의 경우냐를 살펴보셔야 겠다는 겁니다. 프로그램은 되도록 정상의 흐름으로 가도록 해야 겠지요.
구분이 있어도
구분이 있어도 소용없을겁니다.
스트링이 아닌데이터를 컨트롤하고 싶어하는데 스트링처럼 취급하려하니 안되는것이죠.. 구분이있다하더라도
마찬가지의 상황이 오겠죠.. 결국은 스트링데이터가 아니라 바이너리 데이터를 취급하는것이고..
일반적인 바이너리 데이터 다루는방식(data와 size를함께가지고다니는)데로 하면됩니다.
오라클의 ProC varchar 형태가 그렇죠.
C/C++에서 NULL은 널
C/C++에서 NULL은 널 포인터가 필요할 때 쓰는 것입니다. 실제로 NULL은 null-pointer constant로 정의되어 있습니다. NULL이 실제로 0인지, 0L인지, (void *)0인지는 implementation에 따라 다릅니다.
포인터가 올 자리에 null-pointer constant를 쓰면, 해당 포인터는 null pointer가 됩니다. (아무것도 가리키지 않는 포인터)
C 언어에서 null-pointer constant는 0의 값을 가지는 정수 상수식(integer constant expression)이거나, 이 정수 상수식을 void *로 캐스팅한 것이 됩니다.
C++에서 null-pointer constant는 0의 값을 가지는 정수 상수식입니다. 특히 C 언어와는 달리 (void *)0은 NULL이 될 수 없습니다.
C와 C++ 모두, 문자열의 끝을 나타내는 문자는 null character이며, null character는 모든 bit가 0입니다.
NUL이란 용어는, C와 C++ 표준에 없습니다!! NUL은 ASCII 문자 코드 0을 나타내는 약어 표현입니다. (물론 요새 쓰는 시스템에서 ASCII 이외의 문자 코드를 쓰는 시스템이 드물긴 하지만..) 실제, C와 C++ 코드에서 NUL이란 표현을 쓰지 않습니다. 물론 ASCII 코드를 쓰는 시스템에서 NUL 문자는 C와 C++에서 사용하는 '\0'에 해당하긴 합니다. 하지만 이는 ASCII 코드를 다룰 때 얘기고, C와 C++에서 흔히 부르는 널 문자는 "null character" 입니다. 즉 널 문자 또는 null character라고 부르고, '\0'로 씁니다.
요약하면,
- 매크로 NULL (영어: NULL macro)
- 널 포인터 (영어: null pointer)
- 널 포인터 상수 (영어: null pointer constant)
- 널 문자('\0') (영어: null character)
를 구분해서 쓰기 바랍니다.
참고로, (더 헷갈리게 하고 싶어서.. ^^;;) Unicode에서는 널 문자를 나타내기 위해, null character, NUL, NULL을 모두 같은 뜻으로 씁니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기