본문 바로가기

C

[3] 배열과 포인터의 관계

728x90

여러 개의 변수를 쉽게 다루기 위한 것이 배열이기 때문에 배열도 변수처럼 메모리에 저장이 됩니다. 

그러므로 주소 값이 있고, 포인터를 사용할 수 있습니다.

 

이번에는 배열과 포인터의 관계를 알아보도록 하겠습니다.

 

아래 3가지를 중심으로 설명을 하겠습니다.

1. &test[i]로 각 요소의 주소에 접근

2. 배열이름으로 주소 값 전달

3. 배열이름 포인터에 다른 값은 대입 불가

 

&test[i]로 각 요소의 주소에 접근

배열의 각 요소의 주소 값은 제목처럼 일반적인 배열의 요소에 &(어드레스 연산자)를 붙여서 접근할 수 있습니다.

 

배열 이름으로 주소 값 전달

배열 이름만 사용함으로써 배열이 시작되는 첫번째 요소의 주소값. 즉, &test[0]과 같은 역할을 할 수 있습니다.

test와 &test[0]의 값이 같습니다.

 

배열이름 포인터에 다른 값은 대입 불가

배열의 이름으로 포인터를 사용할 때는 다른 주소 값을 대입할 수 없습니다. 그 배열의 1번째 주소 외에는 나타낼 수 없기 때문입니다.

 

 

포인터 변수가 저장된 주소를 바꿀 수 있을까요?

포인터가 저장된 메모리 주소를 개발자가 지정해 정해진 위치에 저장을 할 수 있는가? 가 궁금해졌습니다.

포인터 변수도 변수이므로 주소 값을 가지고있고, 이중 포인터를 사용하면 포인터 변수가 저장된 메모리 주소를 알 수 있을 것입니다.

또, 포인터에는 다른 주소를 대입하면 덮어쓰기가 되는 성질을 갖고 있습니다.

그렇다면, 포인터 변수의 메모리 주소에 값을 대입해서 포인터 변수의 주소를 바꾸거나 고정할 수도 있을까요?

 

찾아보고는 있었지만 아직 해답을 얻지는 못했습니다. 나중에 찾게 되면 올리도록 할 텐데 혹시 보고 아시는 분이 있으시다면 알려주시면 감사드리겠습니다.

 

다음날 다시 고민을 해본 결과, 포인터를 통해 주소를 바꿀 수는 없다고 생각됩니다.

이유는 다음과 같습니다.

1. 포인터는 변수의 주소를 저장한다.

2. 임의로 지정하는 값은 메모리 할당 과정이 없다.(변수나 배열등과 같이 메모리가 할당되어 있지 않다. )

우선 포인터에 값을 대입한다는 것은 메모리에 할당된 변수의 주소를 기억하겠다는 뜻 입니다. 하지만 임의로 할당하는 값은 변수나 배열 같은 내용물들이 할당이 되어있지 않고, 당연히 역참조할 값도 없습니다. 다른 변수의 주소를 대입하는 것은 지시하는 것이 달라지고, 기억하는 주소가 달라지는 것이지 아무 의미가 없는 주소를 기억할 수 있다는 것을 의미하지는 않는 것 같습니다. 

더 저수준의 언어로 간다면 메모리를 직접 지정할 수도 있을 것 같네요. 이런 내용들은 필요할 때 좀 더 자세히 공부해 보도록 하겠습니다.

 

참고자료

merona99.tistory.com/67

 

왜 실행할 때마다 주소가 달라질까?

제 생각에는 컴퓨터 구조에서 익혔던 내용을 응용해 보자면, ssd에 저장된 소스코드를 가져오고 실행을 할 때는 할당되는 메모리들이 DRAM(또는 CPU의 캐시 메모리)에 임시 저장되기 때문에 재실행을 할 때마다 정보가 날아가서 다시 메모리에 할당하는 과정에서 계속 주소가 바뀌는 것이라고 생각했습니다.

 

하지만, 찾아본 결과 그런 이유는 아니고 주소 값이 일정하면 그 주소로 값에 접근에 중요한 정보를 마음대로 바꾸는 "메모리 해킹" 같은 일을 할 수도 있기 때문에 이를 방지하기 위해 ASLR이라는 기술을 windos7 이후부터 적용해서 바뀌는 것이라고 합니다. 

제 생각은 좀 아쉬운 추리였네요ㅜㅜ...

추가적인 설정을 거치면 몇 번의 실행을 해도 같은 주소에 저장되는 것을 알 수 있습니다.

 

참고자료

master-hun.tistory.com/30

 

ASLR이란? 왜 계속 주소가 바뀌는건가요!!! (메모리변조)

ASLR ASMR 아니고아니고! 왜 계속 메모리를 보는데 주소가 바뀌는 것인가??  메모리 주소가 바뀐다는 말이 무엇인지 부터 설명하겠습니다. C언어를 다루다 보면 Debug모드로 코드에 접근하여 메모

master-hun.tistory.com

만약 변수에 값이 들어있지 않은데 역참조를 하면 어떻게 될까?

a == *b == **c는 CCCCCCCC라는 값으로 나오게 됩니다.

찾아보니 이것들은 "쓰레기 값"으로 불리는 값입니다.

좀 더 자세한 내용은 아래 자료를 참고하면 좋을 것 같습니다.

shayete.tistory.com/entry/%EC%B4%88%EA%B8%B0%ED%99%94%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EB%B3%80%EC%88%98%EC%97%90-%EC%93%B0%EB%A0%88%EA%B8%B0%EA%B0%92%EC%9D%B4-%EB%93%A4%EC%96%B4%EC%9E%88%EB%8A%94-%EC%9D%B4%EC%9C%A0

 

초기화되지 않은 변수에 쓰레기값이 들어있는 이유

동아리방에서 이런 얘기가 오고가서 글을 올려봅니다. printf로 초기화되지 않은 a의 값을 출력하는데 "쓰레기값이 왜 들어있는거에요?" 이건 printf 이전에 메모리할당으로 넘어갑니다. 변수를 선

shayete.tistory.com

 

 

이것으로 1 칠판 설명을 마치도록 하겠습니다.

728x90

'C' 카테고리의 다른 글

[5] 함수와 배열인수  (0) 2021.04.23
[4] 이중 포인터(포인터의 포인터)  (0) 2021.04.23
[2] 인수와 포인터  (0) 2021.04.22
[1] 포인터  (0) 2021.04.21
[0] C언어를 시작하며  (0) 2021.04.21