해결된 질문
작성
·
59
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* 라 봐야하는건가요?