Q1. malloc과 memset을 사용하여 메모리를 할당한다는 것은
포인터의 메모리를 할당한다는 것이 아니라, 포인터가 저장하고 있는 메모리 주소(공간)에 담길 메모리를 할당한다는 것인지 궁금합니다. 즉, malloc은 포인터가 저장하고 있는 메모리 주소에 담길 메모리의 크기를, memset은 malloc이 지정한 크기에 해당하는 (포인터가 저장하고 있는 메모리 주소에 담길) 메모리의 값을 할당한다고 설명할 수 있는 것인지 궁금합니다.
Q2.
int *numPtr1 = NULL;
위의 numPtr1 포인터는 450p에 메모리가 할당되지 않은 포인터라고 설명되어 있습니다. 이때 ‘메모리가 할당되지 않았다.’의 의미는포인터가 저장하고 있는 메모리 주소가 할당되지 않았다는 의미와 같은지 궁금합니다.
만약 맞다면,
int *numPtr1 = malloc(sizeof(int));
memset(numPtr1, 0, sizeof(int));
=> 위 코드는 포인터가 저장하고 있는 메모리 주소가 할당되지 않았다는 것이 아니라 포인터가 저장하고 있는 메모리 주소가 저장하고 있는 메모리의 값이 0이다를 의미하는 것이므로, NULL과는 완전히 다른 이야기라고 받아들이는 것이 맞는지 궁금합니다.
Q1. malloc과 memset을 사용하여 메모리를 할당한다는 것은
포인터의 메모리를 할당한다는 것이 아니라, 포인터가
저장하고 있는 메모리 주소(공간)에 담길 메모리를 할당한다는 것인지 궁금합니다. 즉, malloc은 포인터가 저장하고 있는
메모리 주소에 담길 메모리의 크기를, memset은 malloc이 지정한 크기에 해당하는 (포인터가 저장하고 있는 메모리 주소에
담길) 메모리의 값을 할당한다고 설명할 수 있는 것인지 궁금합니다.
일단, 질문에 쓰인 용어가 이상하니까 이해가 안 됩니다.
'포인터가 저장하고 있는 메모리 주소'가 무슨 뜻인지 이해할 수 없는데요.
포인터는 그림으로 이해하시고, 427페이지의 그림 34-9를 외우세요.
이 그림을 스스로 그릴 수 없으면 포인터를 모르는 겁니다.
malloc으로 메모리를 할당했어요. 100바이트를 할당했다고 합시다.
그러면 이 100바이트의 메모리 공간에는 어떻게 접근해요? 그래서 이 공간에 이름을 붙입니다. 단, 메모리 공간에 이름을 붙이는 것이니까 포인터일 뿐입니다. 100바이트 안에 int 값을 담는다면 pointer to int이니까 int*을 선언할 뿐입니다.
메모리에 정수 int 하나를 저장해요. 그러면 이 값에는 어떻게 접근해요? 그게 변수입니다. 변수로 이름을 붙여서 접근하죠.
int age = 23;
이렇게 말이죠. 23이라는 정수를 저장하는 공간에 age라는 이름을 붙여서 접근할 뿐입니다. 프로그래밍 언어론에서 age는 심볼(symbol, 기호)이죠.
메모리에 정수를 저장하니까 int 타입일 뿐입니다.
변수 age는 int 값이 저장된 위치를 가리키는 심볼입니다. int 값이 저장된 변수의 주소를 알고 싶다면 & 연산자를 씁니다. &age는 숫자 23이 저장된 변수의 메모리 주소를 알려주죠. &는 address of 연산자이고, &age는 address of age라고 읽죠.포인터가 저장하고 있는 메모리 주소(공간)에 담길 메모리를 할당한다는 것인지 궁금합니다.
이 문장이 전혀 이해가 안 되어서 답변할 수 없다고 했는데요.
"포인터가 저장하고 있는 메모리 주소"라고 했는데,
포인터는 어떤 메모리 주소도 저장하지 않습니다.
메모리 할당은 malloc이 하고, 할당한 공간에 이름을 붙이는 것인데 int와 구분하기 위해 int*을 쓰고, char와 구분하기 위해 char*을 쓰는 것이 전부입니다.
즉, malloc은 포인터가 저장하고 있는 메모리 주소에 담길 메모리의 크기를, memset은 malloc이 지정한 크기에 해당하는 (포인터가 저장하고 있는 메모리 주소에 담길) 메모리의 값을 할당한다고 설명할 수 있는 것인지 궁금합니다.
이 질문도 전혀 이해가 안 되는 게 문장이 안 맞아서 그런데요.
질문의 문장은 잊어버리고 다음 사실만 기억하세요.
malloc으로 메모리를 할당한다, 할당한 메모리는 포인터로 접근한다.
memset은 malloc으로 할당한 메모리 공간을 초기화하는 데 사용한다.
memset은 초기화할 크기를 지정할 수 있습니다. malloc으로 100바이트를 할당하고, memset으로 100바이트를 초기화할지, 50바이트만 초기화할지도 선택 사항이죠. 예제 코드를 잘 살펴보세요.
malloc으로 할당한 크기만큼을 memset으로 초기화하고 있을 뿐입니다.
함수의 원형, 인자의 의미를 제대로 파악하세요. 질문과 같이 암기해버리면 곤란합니다. 그렇다면 memset에는 왜 size 인자가 있을까요?
Q2.
int *numPtr1 = NULL;
위의 numPtr1 포인터는 450p에 메모리가 할당되지 않은 포인터라고 설명되어 있습니다. 이때 ‘메모리가 할당되지 않았다.’의 의미는포인터가 저장하고 있는 메모리 주소가 할당되지 않았다는 의미와 같은지 궁금합니다.
malloc으로 메모리를 할당하지 않았습니다. numPtr1에는 주소는 할당되어 있습니다. 단지, 그 주소가 NULL일 뿐입니다.
만약 맞다면,
int *numPtr1 = malloc(sizeof(int));
memset(numPtr1, 0, sizeof(int));
=> 위 코드는 포인터가 저장하고 있는 메모리 주소가 할당되지 않았다는 것이 아니라 포인터가 저장하고 있는 메모리 주소가 저장하고 있는 메모리의 값이 0이다를 의미하는 것이므로, NULL과는 완전히 다른 이야기라고 받아들이는 것이 맞는지 궁금합니다.
memset으로 초기화한 numPtr1을 printf("%d\n", numPtr1)로 출력하면 0이 출력됩니다. NULL로 초기화한 변수를 출력하면 프로그램이 중단됩니다. NULL은 메모리 주소로 0번지를 가리키고, 이건 아무것도 없는 것입니다.
VMWare에서 과거 MS-DOS처럼 16비트 모드로 부팅해서 포인터로 NULL을 지정해버리면 메모리 주소의 0번지는 리셋 영역이므로 시스템 자체를 리부팅해버립니다. NULL과 값 0은 전혀 다릅니다.
포인터가 저장하고 있는 메모리 주소가 할당되지 않았다는 의미와 같은지 궁금합니다.
malloc으로 할당한 메모리가 없으면 포인터는 어떤 메모리 주소도 저장하고 있지 않습니다.
'포인터가 저장하고 있는 메모리 주소가 할당되지 않았다'가 말도 안 되는 문장이고요. 할당되지 않았는데 어떻게 저장하고 있을까요?
포인터는 그냥 변수입니다. 그림으로 이해하세요. 그리고 엉터리 다른 C 언어 책들의 포인터 설명을 무시하세요.
제가 포인터에 대해 완전히 잘못 이해했던 것 같습니다. 답변해주신 글 보고, 다시 교재를 탐독해보니 이해가 되었습니다. 구체적으로 정성스레 답변해주셔서 진심으로 감사드립니다. 사실 혼자 공부한다는 게 엄두가 안 났는데 이 교재 선택해서 독학하기로 결정하기를 정말 잘 한 것 같습니다. 파이썬도 공부할 기회가 된다면 코딩도장에서 꼭 수강하겠습니다. 다시 한 번 감사드립니다.