[질문] C에서 char* type 출력시
글쓴이: alwaysN00b / 작성시간: 목, 2004/07/22 - 1:21오전
http://bbs.kldp.org/viewtopic.php?t=41121
와
http://bbs.kldp.org/viewtopic.php?t=29882
를
읽어 보았습니다.
간단하게
#include <sdtio.h> int main(){ char [5] = "abcde"; printf("%s",a); return 0; }
결과는 abcde 뒤에 알수없는값들이 출력될것입니다.
그런데 그값들은 어디까지 출력되나요?
NULL 문자를 만나면 문자열의 끝으로 인식하는것은 알겠습니다.
a[4] = 에 1~254 까지 대입시켜 출력해봤는데 NULL 값만이 문자열 끝인것같습니다.
혹시 또 다른 문자를 만나도 문자열 끝이라고 인식하나요?
아니라면
위 쓰레드 중에
"스트링 끝에 널\0" 은 맞는것 아닌가요?
위 내용을 따질려는것이 아니라 잘 몰라서 질문 올립니다.
Forums:
NULL 문자는 없습니다. NULL 포인터는 있어도..다만
NULL 문자는 없습니다.
NULL 포인터는 있어도..
다만 NUL 문자가 있을 뿐입니다.
각 언어나 API, BIOS 등은 문자열을 취급할 때 문자열의 끝이 어떤가를 정의합니다.
C 는 NUL 문자까지를 문자열이라고합니다.
어떤 언어들은 문자열 맨앞에 길이를 보관하고 길이만큼만을 문자열이라고합니다.
어떤 API 는 $ 까지를 문자열이라고합니다.
---
http://coolengineer.com
답변 감사합니다.http://bbs.kldp.org/viewtop
답변 감사합니다.
http://bbs.kldp.org/viewtopic.php?t=29882
에 있는 pynoos 님 글을 다시 읽어 보았습니다.
주의깊게 읽지 않았던 점 죄송합니다.
C에서 '\0'가 문자열의 끝이라면
"문자열 끝에\0" 은 맞는것이라고 생각하겠습니다. :D
그리고, 위 쓰레드의 링크는
라고 나오더군요.. -_-;; 이런. :cry:
언제나 시작
주의 깊게 읽지 않았다고 죄송까지야... ;)http://www.
주의 깊게 읽지 않았다고 죄송까지야... ;)
http://www.asciitable.com/
GIMF! ascii table로 검색해보니 저거 바로 나오는군요.. (!)
---
http://coolengineer.com
C99를 뒤져봤더니 다음과 같은 구절이 있군요.[quote]5
C99를 뒤져봤더니 다음과 같은 구절이 있군요.
C99에서는 모든 비트가 0인 byte를 null character라 부릅니다. 또한 basic execute character set에는 반드시 null character가 있어야 합니다. 따라서 null character가 0이 아닌 charset은 C언어의 execute character set이 될 수가 없습니다(가능하더라도 편법을 써야 되겠지요).
위의 문장으로부터 'null character는 정수 0이다'라는 명제를 도출하기 위해서는 문서를 죽어라 뒤져봐야 되겠지만... 만약 null character가 정수 0과 서로 다를 수 있다면 다음과 같은 코드는 싸그리 이식성이 없는 코드가 될 것입니다.
그러나 그럴리는 없으므로, null character는 확실히 정수 0이라 봐도 무방할 것 같습니다.
따라서 null character는 확실히 존재하는 용어이며, 그 값은 확실히 0입니다.
참고로 null character와 null pointer의 다른 점이라면 null character는 내부 표현이 확실히 '모든 비트가 0'인데 비해서 null pointer는 그럴 필요가 없다는 겁니다.
표준을 지키는 어떤 구현체는 OK를 출력 안할수도 있겠죠.
[quote]A byte with all bits set to 0, ca
null character : 말그대로 모든 비트가 0으로 세팅된 1 byte 입니다.
보통 NUL 문자라고 부릅니다.
NULL POINTER는 해당 pointer가 참조하고 있는 곳이 없다는 의미입니다.
일반적으로 " 포인터 == 0"과 같은 비교식에서
0는 (void *)0 과 같이 포인터 형으로 먼저 형변환 되는데
이것이 NULL POINTER를 나타내는 것이더라군요.
그래소 보통 시스템에서 NULL POINTER를 가리키는 매크로인 NULL은
#define NULL 0 또는 #define NULL (void *)0 과 같이 정의되어 있습니다.
==========
근데 대부분 사람들이 헷갈려 하는 이유가 null charater 0 이든
정수 0 이든, NULL POINTER 0 이든지 간에 Data Type을 배제하고 보면
걍 0이기 때문에 헷갈려 하는 것 같습니다.(대부분 형변환은 알아서 해주므로)
예를 들어 보면
1. char c = 0;
2. int i = 0;
3. char * p = 0;
위에서 우변은 모두 0이지만 메모리에 들어갈때는..
예제1의 비트는 00000000
예제2의 비트는 00000000 00000000 00000000 00000000
==> 수정한 부분.
예제3의 비트는 00000000 00000000 00000000 00000000
( 대개 NULL POINTER도 모든 비트를 0으로 set하는 경우가 많을 뿐, 시스템에 따라서 다른 어떤 값도 될 수 있다고 합니다. )
이와 같이 같은 0이라 하더라도, type에 따라서 byte수가 다르고 채워지는
내용 또한 다릅니다.
한마디로 NUL 과 NULL POINTER를 비교하는 것은
charater와 pointer를 단순 비교하는 것처럼,
type의 중요성을 간과하는 것이라 생각합니다.
[quote="moonzoo"]예제2의 비트는 00000000 00000
혹시 0과 '0'을 혼동하신 것 아닙니까?
.
아~ 수정했습니다.
댓글 달기