일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 와인선별방법
- 지베르니 가을
- 포르투갈 여행
- gnl
- 지베르니 여름
- 이지젯
- ft_printf
- so_long
- 42
- 지베르니
- push swap 설명
- 지베르니 계절 추천
- 알고리즘 기초
- pipex
- pipex 42
- get_next_line
- 파리 피크닉
- ecole42
- 에꼴42
- 42 so_long
- libft
- push swap
- 서울42
- 와인 고르기
- str함수
- get next line
- 42 libft
- 굿노트 스티커
- printf
- 42 pipex
- Today
- Total
뇌 마음 반반저장소
[42] NULL과NUL과 Nil과 0과 \0.... 본문
작문을 하면서 다른 친구들이 당연하게 생각하는 단어(?), 용어 혹은 구조에 대해서 모르고 있었을 때가 많았다.. (역시나 베이스란 없는 나란 베이비) 그래서 이 페이지에는 누군가 당연하게 알아야 한다고 생각했던 것들을, 내가 몰랐을 때마다 파서 업데이트해보고자 한다. 자, 그럼 본론으로 들어가서,
위의 제목을 크게 두개의 카테고리로 나눌 수 있다.
NULL : 포인터 주소를 초기화해준다. 0!
NUL : 문자열의 끝을 알려준다. \0!
참고로 Nil은 C언어에서 사용되지 않는다고 한다!
그럼 아래에서 Null과 Nul을 자세히 살펴볼까?
1. NULL : 포인터 주소를 초기화 해준다. 0!
일단 널의 정의를 찾아보자.
Null (nil dans certains languages) est une valeur, une constante ou un mot clef présent dans de nombreux langages informatiques, et qui désigne l'état d'un pointeur qui n'a pas de cible ou d'une variable qui n'a pas de valeur. En termes de bases de données, ce mot clef exprime le fait que la valeur d'une donnée n'est pas connue. Il ne s'agit donc pas d'une valeur mais de l'état dans lequel la donnée se trouve, et signifie l'absence de valeur.
Null(일부 언어에서의 nil)은 많은 컴퓨터 언어에서 존재하는 값, 상수 또는 키워드이며, 이는 목표나 변수가 없는 포인터의 상태를 의미한다. 데이터베이스 측면에서, 이 키워드는 데이터의 가치를 알 수 없다는 사실을 표현한다. 따라서 값이 아니라 데이터가 있는 상태이며, 값이 없음을 의미한다.
프랑스라서 그런지 프랑스 위키가 먼저 나왔는데 영어보다 직관적으로 검색 결과가 나와서 뿌듯.
NULL은 실제 값은 없는 것이지만 데이터로써는 유효한 상태인 것 같다.
컴퓨터 용어로써 찾아보니 이렇게 나온다.
The macro NULL is an implementation-defined null pointer constant,
which may be an integer constant expression with the value 0
an integer constant expression with the value 0 cast to the type void*
predefined constant nullptr(since C23)
A null pointer constant may be converted to any pointer type; such conversion results in the null pointer value of that type.
출처
매크로 널은 아래와 같이 정의된 널 포인터 상수이다.
1. 정수 상수식에서 값이 0일 때 사용하면,
2. (void *)0으로 컴퓨터가 이해한다.
3. 그리고 미리 정의된 Nullptr로...
얘는 포인터 유형으로 변환될 수 있으며, 널값을 넣어주면 널 포인터 값을 생성한다.
(NULL은 다양한 헤더에 정의가 되어있다. 내가 작성한 블로그 헤더 파일 설명에도 지금 다시 가서 보니 stdio.h 메크로 부분에 정의가 되어있다!)
잘 봐야 할 것이 있다. 바로 포인터다. NULL로 정의되면 nullptr을 가리킨다? 그렇다면 nullptr은 무엇일까? nullptr은 null pointer로써 메모리 주소 0을 가리키는 포인터이다. 메모리 주소 0 이란? 없을 무 = 無, 메모리 초기화라는 뜻이다.
아래의 예를 보자!
#include <stdio.h>
int main()
{
char *str;
int *nums;
int num;
printf("pointer add: %p\n", str);
printf("pointer add: %p\n", nums);
printf("pointer add: %p\n", num);
return(0);
}
결과 값은 아래와 같이 나온다.
> gcc main.c
> .\a.exe
pointer add: 0000000000000008
pointer add: 0000013bc39713d0
pointer add: 0000000000000000
1. 문장을 할당할 char형 변수의 포인터에 주소가 생성이 되었고,
2. 숫자를 할당할 int형 변수의 포인터도 생성이 되었는데,
3. 숫자 하나만 할당할 int형 변수의 포인터는 NULL 값이다! (흥미롭군..)
그럼 이제 값을 넣어보자.
#include <stdio.h>
int main()
{
char *str;
int *nums;
int num;
printf("pointer add: %p\n", str);
printf("pointer add: %p\n", nums);
printf("pointer add: %p\n\n", num);
//👇추가한 코드
str = "Ab"; //이래도 주소값을 8만 줄까나?
num = 500;
nums = #
printf("pointer add: %p, char : %s\n", str, str); //str의 주소와 값을 확인한다.
printf("pointer add: %p, number: %d\n", nums, nums); //실제 nums의 자리를 확인한다!
printf("pointer add: %p, number: %d\n", *nums, *nums); //포인터를 붙여서 num의 값을 가지고 온다!
printf("pointer add: %p, number: %d\n", num, num); //실제 num의 값!
return(0);
}
결과 값은 아래와 같이 나온다.
> gcc main.c
> .\a.exe
pointer add: 0000000000000008
pointer add: 000001c0e21613d0
pointer add: 0000000000000000
pointer add: 00007ff7f91d9023, char : Ab
pointer add: 0000004dc4fff8dc, number: -989857572
pointer add: 00000000000001f4, number: 500
pointer add: 00000000000001f4, number: 500
그렇다면 이제 포인터를 초기화 해보자!
#include <stdio.h>
int main()
{
char *str;
int *nums;
int num;
printf("pointer add: %p\n", str);
printf("pointer add: %p\n", nums);
printf("pointer add: %p\n\n", num);
str = "Ab";
num = 500;
nums = #
printf("pointer add: %p, char : %s\n", str, str);
printf("pointer add: %p, number: %d\n", nums, nums);
printf("pointer add: %p, number: %d\n", *nums, *nums);
printf("pointer add: %p, number: %d\n\n", num, num);
//👇추가한 코드
str = NULL;
num = 0; //int에 0을 대입하면?
nums = 0;
printf("pointer add: %p, char : %s\n", str, str);
printf("pointer add: %p, number: %d\n", nums, nums);
printf("pointer add: %p, number: %d\n", num, num);
return(0);
}
결과 값은 아래와 같이 나온다.
pointer add: 0000000000000008
pointer add: 0000018158fd13d0
pointer add: 0000000000000000
pointer add: 00007ff6ba949023, char : Ab
pointer add: 000000096bfff83c, number: 1811937340
pointer add: 00000000000001f4, number: 500
pointer add: 00000000000001f4, number: 500
pointer add: 0000000000000000, char : (null)
pointer add: 0000000000000000, number: 0
pointer add: 0000000000000000, number: 0
(void *) 0 은 int 0과 같다! NULL과 같다!
포인터에 NULL혹은 0을 넣어주면 그곳이 초기화가 된다. (정수 0의 데이터 주소도 0이라는 뜻!)
*흥미로운 점 : free를 하면 메모리 주소도 초기화가 되나??
헉! 찾아보다가 굉장히 흥미로운 블로그를 찾았다.
malloc을 free 하고 null로 다시 정의해줘야 하는 이유 :
free (ptr);
prt = NULL;
free는 값만 해제해주고 메모리 주소는 해제되지 않기 때문에 포인터를 0으로 초기화시켜줘야 한다!
출처: https://jybaek.tistory.com/672
2. NUL : 문자열의 끝을 알려준다. \0!
NUL은 문자열과 관련되어 있다. Nul은 아스키코드 10진 정수 0번으로 가장 앞에 있는 단어인데, 이는 문자열의 끝을 알려준다. 사실 이 NUL은 NULL character라는 뜻이다! Nul은 '\0'이렇게 표현한다.
아래의 예시를 보자.
#include <stdio.h>
int main()
{
int num = 0;
char str = 0; //그냥 0을 넣었을 때
char str1 = '\0'; //NUL을 넣었을 때
char str2 = 48; //숫자 0을 출력하고 싶을 때 (printf %c)
char zero = '0';
printf("pointer add: %p, number: %d\n", num, num);
printf("pointer add: %p, char : %s\n", str, str);
printf("pointer add: %p, char : %s\n", str1, str1);
printf("pointer add: %p, char : %c\n", str2, str2);
printf("pointer add: %p, char : %c\n", zero, zero);
return(0);
}
결과 값은 아래와 같이 나온다.
> gcc main.c
> .\a.exe
pointer add: 0000000000000000, number: 0
pointer add: 0000000000000000, char : (null)
pointer add: 0000000000000000, char : (null)
pointer add: 0000000000000030, char : 0
pointer add: 0000000000000030, char : 0
1. int num = 0 : NULL pointer의 예시.
2. char str = 0 : 그냥 0을 넣으면 메모리가 초기화된다.
3. char str1 = '\0' : (문자열의 끝으로 끝. 문자열 메모리 값은 0이다. 끝만 알릴 뿐!) 아무것도 들어있지 않다.
4. char str2 = 48 : 숫자 0을 출력하는 아스키코드 48을 입력하고 printf의 연산자 %c를 사용한다.
5. char zero = '0' : 숫자 0을 바로 출력할 수 있도록 따옴표를 사용하고 printf의 연산자 %c를 사용한다.
3. 마치며
Null은 Null Pointer로 포인터의 메모리 자리를 0으로 초기화해준다! ( 0 과 같다)
NUL은 Null character로 문자열의 끝을 알려준다!( \0 과 같다)
'좌뇌 > 왕초보의 컴퓨터 언어 세계' 카테고리의 다른 글
자료구조 (Data Structure) 기본 이해하기 (0) | 2023.01.18 |
---|---|
[42] valgrind로 메모리 누수 찾기 (0) | 2023.01.10 |
[42] const char의 *위치에 따른 다른 의미 (0) | 2023.01.05 |
[42]void 함수인데 return 값이 가능하다구? (0) | 2022.12.29 |
[42] argc, argv 거 어떻게 쓰는 겁니까? (0) | 2022.12.04 |