변수는 메모리에 어떻게 있습니까? 이 코드를메모리상의 변수 할당, 포인터
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에서 포인터로 놀아 변수의 크기보다 더 많은 위치를 추가하여 다른 변수를 수정했습니다.
주소에 % p를 사용하십시오. 두 번째 예제의 변수에는 자동으로 0 값이 할당됩니다. –
검색 창에서 'bss'를 찾으십시오. 차이점은 데이터 세그먼트의 초기화 된 데이터와 0으로 초기화 된 데이터를 보유하는 BSS (블록으로 시작된 심볼) 세그먼트의 초기화되지 않은 데이터 사이입니다. 예를 들어, [BSS 세그먼트가 필요한 이유는 무엇입니까?] (0120-383-100) –
컴파일러는 언제든지 변수를 할당합니다. –