공부(IT)/c

[c] 메모리 침범하기

Dohyun Kim 2016. 2. 10. 00:34

1. 개요

 원래 목적은 아무메모리나 참조해서 그 메모리의 주소값을 각 자리마다 계속 더하여  한자리수로만들후 이 값의 분포가 얼마나 랜덤한지에 대해 알아보려는 것이었다.

하지만 쓰레기값을 참조하려다가 그냥 선언되있지 않은 메모리영역을  주소값 1씩 늘려 막 참조하는방식으로 해보았는데 결과가 흥미로웠다.

당연히 참조할수없는곳을 건드려서 금방 다운되는경우가 대부분이었지만 가끔씩 아무리 참조해도 에러나지않는경우도 있었다.

그냥 안쓰는 영역이 많았나보다 했지만 만단위 넘게 참조해도 멀쩡했다.


2.소스코드

----------------------------------------------------------------------------------------------------------------------------------------------------------

#include <stdio.h>


int sumPosition(int num) {

int sum = 0;

num > 0 ? num : (num *= -1);

while(num>9){

num = num/10 + num % 10;

}

return num;

}


int findArrSum(int*arr, int len){

int i = 0;

int sumTemp=0;

for (i = 0; i < len; i++)

sumTemp += arr[i];

return sumTemp;

}


int main() {

int num[10] = { 0 };

int startMemTrigger = 0;

int* startMem =&startMemTrigger;

int i = 0;

int numTemp = 0;

int totalCount = 1;



while (totalCount++) {

num[numTemp = sumPosition(*(startMem+totalCount))]++;

printf("total count : %7d || now meomey : %7x ||  now num : %2d  ||",totalCount, startMem + totalCount, numTemp);

for (i = 0; i < 10; i++) {

printf("num%2d : %2.2lf ||", i, (double)num[i]/findArrSum(num,sizeof(num)/sizeof(int)));

}

printf("\n");

}

return 0;

}

----------------------------------------------------------------------------------------------------------------------------------------------------




3. output

 결과 사진에서 볼 수 있듯이 7만번넘게 카운트했는데도 멀쩡히 돌아가고있다.


 








4.결론


그렇다. 한참 더 기다렸더니 결국 에러났다. 그냥 빈영역이 많은거였다. 사실 10만번이나 카운트 되었다해도 메모리 양으로 따지면 40만바이트(4*10), 즉 0.4메가 밖에 지나지 않은것이다. 그정도 공간은 낭비되고 있을 수도 있다 싶었다.

원래 목적이었던 쓰레기값을통한 랜덤성 구현확인은 확인방법은 단순히 숫자별 등장횟수가아닌 한눈에 알아보기쉽도록 등장비율로 고쳐서 확인했다. 처음엔 특정 숫자가 앞도적이었지만(이는 현제 실행중인 프로그램의 값 초기화 상태에 따른것일 수 있음) 후로 갈수록 고른 분포를 보이는것이 확인됬다. 따라서 쓰레기값은 랜덤하게 골고루(?) 나타난다.