|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=2793 [복사]
c의 치명적 오류....같다구 생각 됨..
홈피다가 메모 했다가 올려서;; 미처 어투를 고치지 못한점 죄송합니다...
아시는분점 알려주세요..ㅠ-ㅠ
메모리 공부를 조금 이라두 해놓자...
메모리 침범ㅇㅔ 관해서...고민하다가...
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,a=0;
int val[8]={0};
puts("구하고자 하는 단수를 입력하시오.");
scanf("%d",&a);
printf("첨 a의 주소 : %d\n",&a);
for(i=0;i<10;i++)
{
printf("현재 a의 값 : %d\t현재 i의 값 : %d\t 현재 val[i]의 값 : %d\n val[i]의 주소 : %d\n",a,i,val[i],&val[i]);
val[i]=a*i;
printf("%d단의 %d*%d 의 결과는%d입니다\t\nval[i]번지 : %d\n",a,a,i,val[i],&val[i]);
printf("i의 연산후 값 : %d\ti의 주소 : %d\ta의 주소 : %d\t\n\n",i,&i,&a);
}
printf("\ti = %d\t\t번지 : %x\n&val의 주소 : %x\t&val[i]의 주소 : %x\n",i,&i,&val,&val[i]);
return 0;
}
/* 코드를 실행해 보면...2*7에서
i의 주소는 1245052
//처음 메모리가 잡힌 후 값에 변화만 있을뿐주소는 변함이 없다.
a의 주소는 1245048
//i와 동일하게 값만 변함.
val[i]의 주소는 7까진 변화가 없더니 i가 8이 되는순간 2가된다..
무슨 의미인가?
C에 단점이 여기서 나온다...배열에 크기가 작은데 오류를 주거나 막지를 않는다;
그럼 val[i]가 2인 이유는?
처음 a값을 봤는가? a의 초기값은 2(2로 입력했을때)이고, 번지는 1245048이다.
그와 같이 val[i]도 주소가 계속 증가하다 i가 8이 되면서 a주소를 침범해 a의 번지에 영향을 주고 자기는 2가 된다...
고로 원래의 식은
val[i] = a*i; 인 식에서 2(a는 현재 2를 입력했음.)*i(i는 현재 반복문에 의해 증가중.)가 원래 식이지만
val[i]의 번지가 a의 번지를 침범해서...
val[i]=2*8; <=저것이..
val[9](초기 선언에서 8까지만 있으므로 [9]=a입니다.)의 값이 a의 번지로 저장이 되니...초기 2였던 a의 값(입력을 2로 했으므로.)이
16이 되구, 이 과정후에 연산에서 val[i]가 i의 번지를 침범하므로
(a는 16.why? val[i]가 초기2였던 a의 값을 16으로 고치구 넘어갔으므로..)
val[i]=a*i;는
val[i] = 16*8 ->코드의 순서를 보면 현재 a,i,val[i]의 값을 찍구 나서 연산에 들어간 다음 출력 결과를 화면에 뿌려준다.
고로...val[i](a=val[i]이 되버렸으므로)는 16이므로
결과 값은 16을...a도 16(val[i]이 2->16으로 변경하구 가서)
i는? val[i]가 주소를 침범하지 않아서 아직은 고대로 값이 증가
요것과 마찬가지로 i도 val[i]이 값을 건디려 마지막엔 144란 쓰레기값(의도 하지 않은 쓸모 없는 값이므로...;;)이 툭 티 나옴.
글고 마지막 결과는 0인 이윤...
.....4시간 싸매다...0인 이유를 int 범위로 접근했다가;; 삽질하구 일단 있는 내용만 첨가 합ㄴㅣ다;
이글을 다 읽고 아는 내용이라면...설명좀..ㅠ-ㅠ
많이 허접합니다...전 전문가가 아니므로 미흡한 내용이 많습니다...이글을 혹 다 읽으신 분이 계시다면...
추가로 답글을 달아 주셔서...보충 해주시면 감사하겠습니다...오늘하루도 즐거운 하루 되세요...
|
Hit : 4047 Date : 2010/12/06 05:40
|