스택큐힙리스트

포인터 배열 외부문제 본문

카테고리 없음

포인터 배열 외부문제

스택큐힙리스트 2023. 11. 17. 10:39
반응형

파일 1.c


int a[10];

파일 main.c:


extern int *a;
int main()
{
printf(%d\n, a[0]);
return 0;
}

세그멘테이션 폴트가 발생합니다! 무엇이 잘못되고 있는 걸까요?

답변 1

정상적으로 작동합니다. 그러나 이는 배열 자체가 포인터가 아니라는 것을 의미하지 않습니다. 따라서 배열을 포인터처럼 다루는 경우, 실제로는 배열 유형을 int 객체의 주소를 보유한 포인터처럼 다루는 것입니다. 배열이 실제로는 int 객체가 아닌 int 객체의 시퀀스이므로, 실제로 유효한 위치를 가리키지 않는 메모리 위치를 간접 참조하려고 시도하고 있는 것입니다 (즉, array의 첫 번째 슬롯은 0과 같은 숫자 정수 값이며, 이는 NULL을 간접 참조하는 것과 같습니다). 그래서 세그폴트가 발생합니다. 이와 같이 다음과 같이 작성한 경우에 주목하세요:


int array[] = { 1, 2, 3, 4, 5};
int b = *array;

아직도 작동합니다. array는 다시 암시적으로 정수 값의 시퀀스를 보유한 메모리 블록을 가리키는 포인터로 변환되어 그 첫 번째 시퀀스의 값을 얻기 위해 간접 참조됩니다. 그러나 당신의 경우, 배열을 현재 코드 모듈에 외부로 정의된 포인터로 선언함으로써 보통 수행되는 포인터로의 암시적 변환을 건너뛰고 객체 자체가 아니라 객체 배열 대신 객체에 대한 포인터로 배열 객체를 사용합니다.

답변 2

포인터 배열(extern) 질문
포인터 배열(extern)은 프로그래밍에서 자주 사용되는 중요한 개념 중 하나입니다. 이 글에서는 포인터 배열의 개념과 사용법에 대해 자세히 알아보고자 합니다. 또한 포인터 배열의 활용 예시와 중요성에 대해서도 살펴보겠습니다.
포인터 배열은 메모리의 주소를 저장하는 변수인 포인터와 배열의 특징을 결합한 것입니다. 배열은 여러 개의 동일한 데이터 타입을 저장하는 데에 사용되고, 포인터는 변수나 배열의 주소를 가리키는 데에 사용됩니다. 따라서 포인터 배열은 배열의 각 요소들이 주소를 가리키는 형태로 구성됩니다.
포인터 배열의 선언 방법은 다음과 같습니다.
```
int *arr[5];
```
위의 예시는 integer 타입의 주소를 저장하는 포인터 배열을 선언한 것입니다. arr은 포인터 배열의 이름이며, 5개의 요소를 가지고 있습니다. 각 요소는 integer 타입의 주소를 가리키고 있습니다.
포인터 배열의 사용 예시로는 함수에서 배열을 매개변수로 받고 싶을 때가 있습니다. 함수 내에서 배열은 크기가 고정되어 있기 때문에 유연한 작업이 어려울 수 있습니다. 이때 포인터 배열을 사용하면 배열의 주소를 매개변수로 전달할 수 있어 배열의 크기를 신경쓰지 않고 작업할 수 있습니다.
포인터 배열은 또한 다른 파일에 선언된 변수를 외부 참조(extern)할 때에도 사용됩니다. extern 키워드는 다른 파일에 선언된 변수를 현재 파일에서도 사용할 수 있도록 합니다. 포인터 배열을 활용하면 여러 파일에서 동일한 변수에 접근할 수 있으며, 이를 통해 데이터를 공유하고 필요한 정보에 접근할 수 있습니다.
포인터 배열은 프로그래밍에서 매우 중요한 개념이며, 다양한 상황에서 유용하게 활용될 수 있습니다. 이를 통해 배열의 크기에 구애받지 않고 유연한 작업을 할 수 있으며, 다른 파일에 선언된 변수에 접근하여 데이터를 공유할 수도 있습니다. 더불어 포인터 배열은 프로그래밍의 성능과 효율성을 향상시키는 데에도 기여할 수 있습니다.
결론적으로, 포인터 배열(extern)은 프로그래밍에서 유용하고 강력한 도구로 활용될 수 있는 개념입니다. 올바르게 이해하고 잘 활용한다면, 프로그래밍 작업을 보다 효율적으로 수행할 수 있으며, 다른 파일의 변수를 활용하여 데이터를 공유할 수도 있습니다. 따라서 개발자들은 포인터 배열(extern)에 대한 이해를 깊이 있게 하여 프로그래밍 역량을 향상시키는 데에 집중해야 합니다.

반응형
Comments