프로그래밍

 3198, 1/160 회원가입  로그인  
   영원한공부
   [C언어] 배열에 궁금한 게 생겼어요.

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=2928 [복사]


2521번 질문 글을 보면

#include <stdio.h>

int main(void)
{
        int c=20; // &c = &a[6]
        int b=12; // &b = &a[5]
        int a[5];   // a[0], a[1], a[2], a[3], a[4]      

        return 0;
}

이런 식으로 코딩을 하면 a[5]는 바로 위에 선언한 b와 같은 주소를 갖게 되는데 어째서 이런 게 되는거죠??

그리고 뒤에 a[6], a[7] 을 더 출력 해보면 a[6]은 c와 같은 주소고 , a[7]은 쓰레기 값을 갖네요. 왜 이런 게 되는거죠?

  Hit : 5206     Date : 2011/03/28 02:18



    
lMaxl04 데이터가 스택에 들어가는 방식 때문에 그렇습니다.
저렇게 선언하면 스택에는 다음과 같은 구조가 됩니다.
a[0]
a[1]
a[2]
a[3]
a[4]
B ==a[5]
C ==a[6]
EBP ==a[7]
EIP ==a[8]

자세한건... 스택에 관해 공부하시길 ㅠㅠ
2011/03/28  
영원한공부 아 이건 문법이 아니라 자료구조상의 문제 였군요. 답변 해주셔서 감사합니다. 2011/03/30  
날아라통닥 어떻게 보면 간단한 오버플로우라고 생각되네요

한가지 개념을 추가하자면
일단 a[5]가 가르키는 것은 배열a의 시작주소값에서 int형 만큼 5번 떨어진 곳을 가르키고 있기때문에 B가 출력되는 것을 확인할 수 있다는 거에요

한가지 참고할게 있다면 어떤 컴파일러는 스택에 변수를 쌓을때 오버플로우를 막기 위해 변수 사이사이에 쓰레기 값을 넣는 것도 있다죠~
2011/04/04