Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C언어에서 초기화되지 않은 포인터에 화살표 연산자(->)를 사용할 수 없는 이유

C언어에서 초기화되지 않은 포인터에는 사용자 입력을 직접 읽어 들일 수 없습니다. 포인터가 아직 어떤 유효한 메모리 주소도 가리키고 있지 않은 상태이기 때문에, 그 주소에 데이터를 쓰려고 하면 정의되지 않은 동작(undefined behavior)이나 프로그램 비정상 종료가 발생할 수 있습니다.


올바른 해결 방법은 다음과 같습니다.

  1. 구조체(struct) 타입의 일반 변수를 먼저 선언합니다.
  2. 그 변수의 주소(& 연산자)를 포인터에 할당합니다.
  3. 이후에야 화살표 연산자(->)를 통해 구조체의 내부 멤버에 안전하게 접근할 수 있습니다.

예제 코드

#include <stdio.h>

struct example {
char name[20];
};

main() {
struct example *ptr; /* 아직 초기화되지 않은 포인터 */
struct example e; /* 실제 데이터가 저장될 구조체 변수 */

puts("enter name");
gets(e.name); /* 구조체 변수 e에 직접 입력을 받음 */
ptr = &e; /* 변수 e의 주소를 포인터에 할당 */
puts(ptr->name); /* 이제 화살표 연산자로 멤버 접근 가능 */
}

실행 결과

위 코드를 실행하면 일반적으로 다음과 같은 결과가 출력됩니다.

enter name Disha
You entered Disha

핵심 정리

포인터는 단순히 주소를 담는 변수일 뿐이며, 선언만으로는 가리킬 대상이 존재하지 않습니다. 따라서 반드시 실제 메모리 공간(여기서는 구조체 변수 e)을 확보한 뒤 그 주소를 포인터에 연결해 주어야 합니다. 이 과정을 거치면 ptr->name처럼 화살표 연산자를 통해 구조체 멤버에 자유롭게 접근할 수 있습니다.


참고로 gets() 함수는 버퍼 오버플로우 위험이 커서 표준에서 제거(deprecated)되었으므로, 실무에서는 크기를 지정할 수 있는 fgets() 사용을 권장합니다.