프로그래밍

 3198, 1/160 회원가입  로그인  
   LCF
   흠...;;욕만 하지말아주세여..;;

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



    
LCF ....혼자 그냥 예제 풀다가 올립니다...다시한번 말씀드리지만...전 전문가가 아니므로 내용이 많이 미흡합니다...
아시는 내용이라면 읽어보시구 추가로 내용을 남겨주셔서...다른 분들도 도움이 되셨으면 좋겠습니다...읽느라 수고하셨습니다;;

내용 남겨주신거에 다시한번 감사드리구요...ㅠ-ㅠ
2010/12/06  
멍멍 이런 식으로 시험 코드를 짜보며 공부하는 방법 좋습니다~
하지만.. 질문의 요지는 잘 이해하지 못했네요^^;
2010/12/07  
dawon15 질문글이 아닌것 도 같은...?'' 2010/12/07  
LCF 아...; 이거 혼자 공부하다가 메모 한것을 옴겨 논거라...; 내용이 이상하긴 해요...
다름이 아니라... 제가 제대로 문제를 인식하구 있는건지 몰라서요....;
2010/12/07  
CodeAche 질문을 잘 하는것도 실력입니다.
뭘 모르는지, 뭘 알고싶은지 파악해내는 능력이니까요.
아마 내용이 좀 길고 잘 이해가 안되서 메모해둔 내용을 그대로 올리신거같은데 ㅎ
본인이 봐서 어려운건 다른사람이 봐도 어렵습니다.
다시한번 차근차근보시고, 모르는게 어떤건지..현재 문제점이 뭔지.
명료하게 올리면 알고자 하는 것에 대해서 더 빠르게 얻어가실 수 잇을 듯 합니다.
2010/12/08  
LCF 답변 감사합니다... 2010/12/08