인프런 커뮤니티 질문&답변
char 포인터 관련 질문
해결된 질문
작성
·
107
1

안녕하세요.
4.4 strlen 강의에서,
char 자료형은 크기가 1바이트. 포인터는 4바이트라고 하셨는데, 자료형보다 큰 값을 자료형이 담아내도 되는건가요? 오버플로 같은 문제는 안일어날까요?
답변 2
2
안녕하세요? 질문&답변 도우미 Soobak 입니다.
포인터를 처음 접하실 때 혼동하기 쉬운 부분에 대한 질문이시네요.
일반적인 값 을 담는 자료형과 주소 를 담는 포인터 자료형 사이에서 혼동이 있으신 것 같습니다.
char 자료형은 말씀해주신 것 처럼, 1 바이트 크기를 가지며, 문자 값을 저장합니다.
하지만, char* (문자 포인터) 자료형은 실제 데이터가 저장된 메모리 주소 를 가리키는 주소값을 저장하는 변수 입니다. (운영체제와 컴파일러 환경에 따라 말씀해주신 것처럼 4바이트, 혹은 8 바이트의 크기를 가집니다.)
따라서,
char c = 'A'; // 1바이트
char *p = &c; // p는 c의 '주소' 를 저장 (4바이트 또는 8바이트): 여기서 p 가 담고 있는 값은 c 의 메모리 주소이며, 포인터 변수는 값의 실제 크기가 아닌, 메모리 주소의 크기를 가지고 있기 때문에 오버플로우와 같은 문제가 발생하지 않습니다.
이해가 어려우시거나 궁금하신 점 있으시면 편히 댓글 달아주세요.
안녕하세요? 질문&답변 도우미 Soobak 입니다.
char *p 의 표현 또한, 변수 p 는 "문자(char)를 가리키는 포인터" 라는 의미입니다.p 바로 이전에 * (asterisk) 가 삽입되어 있습니다.
이와 관련하여, 사실 C언어에서는 자료형과 * 사이에 공백을 자유롭게 넣어 포인터를 선언할 수 있습니다.
char *p;
char* p;
char * p;: 모두 같은 표현입니다. 하지만, 보통 char *p; 형태를 선호합니다.
이러한 이유와 관련돼서는 따배씨 강의 중 교수님께서 설명해주시는데요.
변수를 선언 할 때는 다음과 같이 한 줄에 같은 자료형의 변수 여러 개를 , 로 구분하여 선언할 수 있습니다.
char* p1, p2;: 이 때, 위와 같이 작성하면 앞에 작성된 p1 만 '포인터' 이고 p2 는 일반 char 변수가 됩니다.
char *p1, *p2;: 따라서, 혼동을 피하기 위해 보통 위와 같이 작성합니다.
즉, char *p; 에서 * 는 생략된 것이 아니라, 공백으로 구분된 것이며,char* p; 형식보다 char *p; 형식이 더 선호되는 이유는, 여러개의 포인터 변수를 선언할 때 혼동을 줄이기 위함입니다.
0
안녕하세요, 인프런 AI 인턴입니다. luki님.
질문해주신 내용을 보고 char 자료형과 포인터의 차이에 관한 혼란이 있으신 것 같습니다. char 포인터는 그 자체로 4바이트 또는 8바이트(시스템에 따라 다름)의 메모리 크기를 가지며, 이는 char 타입의 데이터를 가리키는 주소를 저장하는 데 사용됩니다. 따라서 포인터가 가리키는 데이터의 실제 크기와 관련이 없습니다.
char 포인터가 4바이트라면, 이는 메모리 주소의 크기를 의미하며, 포인터 자체가 가리키는 데이터의 크기와는 관련이 없습니다. 따라서 char 데이터(1바이트 크기)를 가리키는 데 전혀 문제가 없습니다. 오버플로는 포인터가 아닌 실질적으로 메모리를 관리할 때 발생할 수 있는 문제로, 관리하지 않은 동적 할당 메모리를 사용할 때 주의해야 합니다.
유사한 질문에 대한 논의가 있는 게시물을 찾아보았습니다:
- 크기에 대해!
여기에서는sizeof를 이용하여 자료형의 크기를 측정할 때 발생할 수 있는 혼동에 대해 설명합니다.
질문이 충분히 해결되지 않은 경우, 상세한 내용을 기반으로 다시 질문을 해주시면 감사하겠습니다. 저희 답변이 불충분할 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






답변 해주셔서 감사합니다
char*(문자 포인터)라고 하셨는데,그럼 여기서 char *p = &c;의 char는 , char* 라서 char 같은 자료형이 아닌, 주소값을 저장하는 변수이며,
char 에 *가 생략된거라 원래는 char* 라 봐야하는건가요?