2014-02-25 2 views
0

변수는 메모리에 어떻게 있습니까? 이 코드를메모리상의 변수 할당, 포인터

int w=1; 
int x=1; 
int y=1; 
int z=1; 

int main(int argc, char** argv) { 
    printf("\n w %d",&w); 
    printf("\n x %d",&x); 
    printf("\n y %d",&y); 
    printf("\n z %d",&z); 
    return (EXIT_SUCCESS); 
} 

을 가지고 있고 우리는 선언하고 할당 될 때 다른 정수, 주소는 4 개 개의 위치를 ​​이동하는 것을 볼 수가이

w 134520852 
x 134520856 
y 134520860 
z 134520864 

을 인쇄 (바이트 나는 가정, 아주 논리 것) . 그러나 우리는 다음 코드에서와 같은 변수를 할당하지 않는 경우 :

int w; 
int x; 
int y; 
int z; 

int main(int argc, char** argv) { 
    printf("\n w %d",&w); 
    printf("\n x %d",&x); 
    printf("\n y %d",&y); 
    printf("\n z %d",&z); 
    return (EXIT_SUCCESS); 
} 

우리가 주소 사이 4 개 개의 위치가 볼 수있는이

w 134520868 
x 134520864 
y 134520872 
z 134520860 

를 인쇄,하지만 그들은 순서에 있지 않습니다. 왜 이런거야? 어떻게 컴파일러가 작동합니까?

왜 내가 이것을 묻는 지 알고 싶다면 보안을 연구하기 시작했으며 일부 공격 (예 : 정수 오버플로 공격이 작동하는 방식)을 이해하려고하기 때문에, C에서 포인터로 놀아 변수의 크기보다 더 많은 위치를 추가하여 다른 변수를 수정했습니다.

+1

주소에 % p를 사용하십시오. 두 번째 예제의 변수에는 자동으로 0 값이 할당됩니다. –

+3

검색 창에서 'bss'를 찾으십시오. 차이점은 데이터 세그먼트의 초기화 된 데이터와 0으로 초기화 된 데이터를 보유하는 BSS (블록으로 시작된 심볼) 세그먼트의 초기화되지 않은 데이터 사이입니다. 예를 들어, [BSS 세그먼트가 필요한 이유는 무엇입니까?] (0120-383-100) –

+0

컴파일러는 언제든지 변수를 할당합니다. –

답변

2

첫 번째 예는 다른 할당 코드를 생성하는 변수를 초기화합니다. gcc (가스)에 의해 생성 된 어셈블리 파일을 살펴보면 다음과 같이 나타납니다.

.globl _w 
    .data 
    .align 4 
_w: 
    .long 1 
    .globl _x 
    .align 4 
_x: 
    .long 1 
    .globl _y 
    .align 4 
_y: 
    .long 1 
    .globl _z 
    .align 4 
_z: 
    .long 1 

그리고 이것은 기본적으로 메모리 주소를 지정합니다.

두 번째 예는 초기화되지 않은 변수를 생성하고 Jonathan은 말한대로 BSS으로 이동합니다. 어셈블러 코드는 다음과 같습니다.

.comm _w, 4, 2 
.comm _x, 4, 2 
.comm _y, 4, 2 
.comm _z, 4, 2 

그러면 변수가 메모리에 저장되는 순서를 보장 할 수 없습니다.

1

숫자의 두 번째 세트도 연속적이며 소스와 동일한 순서로 정렬되지 않습니다. 그 이유는 초기화의 순서를 유지하기 때문에 컴파일러가 순서대로 변수를 초기화 할 때 두 번째 경우에 무작위 순서 만 얻는다는 것입니다.

어쨌든 이것은 컴파일러에 달려 있습니다. 두 경우 모두 동일한 패턴 (순서대로, 4 바이트 떨어져 있음)을 얻습니다.