[C언어] 0과 NULL값의 비교

akrnldytpq의 이미지


제가 프로그램을 공부한지 얼마 안되서요..

질문 하나 드릴꼐요

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 레퍼런스에 보니까 안나와있어서 염치불구하고 고수님들께 여쭤봅니다.
도와주세요 ㅠ.ㅠ

klara의 이미지

무슨 뜻인지 모르겠습니다. NULL은 0입니다.

mg2000의 이미지

데이터를 넣은 배열의 크기를 알고 싶으신건가요?

strlen은 문자열의 길이를 알려주는 겁니다.

문자열은 NULL로 끝나니, 2가 나오는게 맞고요.

데이터를 넣은 배열의 길이를 아는 방법은 없습니다.

정태영의 이미지

strlen은 0의 위치를 찾는 함수고 (C 에서의 string은 NULL terminated string이죠.) 작성하신 코드도 그렇다보니 당연히 2가 나오는 겁니다.

--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

akrnldytpq의 이미지


NULL값은 0이지만 현재 buff라는 배열에는 5개의 값이 들어가있자나요..

저 상황에서 buff라는 배열의 길이를 구하면 5라는 값이 나와야 하는데..

2라는 값이 나와서 여쭤본거에요 ㅠ.ㅠ

소스를 어떻게 고쳐야 배열원소의 개수가 5개로 나오는가 라는 질문이예요 ㅠ.ㅠ

klara의 이미지

sizeof(buff)/sizeof(buff[0]) 와 같이 하면 5가 나올것입니다.
참고로 이것은 buff가 '배열이름'인 경우에만 가능합니다.
포인터에 대해서는 따로 기록해두지 않는 한 알아내는 방법은 없습니다.

bushi의 이미지

10 이 나오겠죠.
질문하신 님이 원하는 것은 5 이고.

공간의 크기(혹은 갯수)에 대한 질문이 아니라
값을 넣은 것과 넣지 않은 것을 구별할 방법을 묻는 질문 같습니다.

OTL

klara의 이미지

아 그렇네요. 다섯개만 들어있길래 다섯개짜린줄 알았더니 10개짜리였군요.

akrnldytpq의 이미지

그럼 저 상황에서 데이터를 넣은 배열의 길이를 알아내는 함수는 없는건가요??

klara의 이미지

없습니다.

akrnldytpq의 이미지


아 속이 시원하네요..

차라리 기록을 하는 방법으로 가야 되겠어요 ㅠ.ㅠ

저는 방법이 있는줄 알고 벌써 2시간째 소스를 몇번을 고쳐봤는지... ㅠ.ㅠ

여튼 감사합니다~

jick의 이미지

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 (중간쯤에 테이블 있음)

winner의 이미지

물론 C 언어의 역사를 생각하면 이해할 수 있기는 한데 현대로 오면서 C 언어를 보다 고급의 타입이론으로 C 탄생 시절의 어셈블리 래퍼의 의미를 이해할려면 혼돈만 오는게 아닌가 싶습니다.

select99의 이미지

전둘다 0인게 마음에들고 아예 표준에서 둘은 완전히 동일하고 무조건 0이다라 고 못박아줬으면하는데요...

winner의 이미지

이식성을 위해서 표준에서 bit 표현이 다를 수 있음을 받아들인걸테고요.

sangwoo의 이미지

최소한 C99에서는 NULL이랑 NUL의 bit 표현이 0이어야 한다는 내용이 있었던 거 같습니다.
----
Let's shut up and code.

----
Let's shut up and code.

jinyeong의 이미지

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 는 전혀 다르다는 것과 현재 님이 하고 계신 상황이 보통(정상)의 경우냐를 살펴보셔야 겠다는 겁니다. 프로그램은 되도록 정상의 흐름으로 가도록 해야 겠지요.

select99의 이미지

구분이 있어도 소용없을겁니다.

스트링이 아닌데이터를 컨트롤하고 싶어하는데 스트링처럼 취급하려하니 안되는것이죠.. 구분이있다하더라도

마찬가지의 상황이 오겠죠.. 결국은 스트링데이터가 아니라 바이너리 데이터를 취급하는것이고..

일반적인 바이너리 데이터 다루는방식(data와 size를함께가지고다니는)데로 하면됩니다.

오라클의 ProC varchar 형태가 그렇죠.

cinsk의 이미지

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/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.