|
안녕하세요? 레조입니다.
할당한것을 보여주는 것이 아니라 그 주소를 보여주는 것입니다.
메모리에 할당(OS의 허가를 얻는것) 하는것은 2가지 뿐입니다.
1. 컴파일 시간에 명시적으로 할당하는것(static binding)
int i;
2. 실행 시간에 new(또는 malloc)을 통해 만든 후 그 위치를 포인터에
대입하는 것(dynamic binding)
int* ptr_var = new int;
김대의 님이 쓰신 글 :
: 모든 님들이 쓰레기 주소에다가 즉 할당되지 않은 주소에다가 입력을 하신다고 말씀만 하시고,
: 배열로 할당하라는 말씀을 하십니다. 그런데요. 아래 프로그램을 보면 주소가 할당된것을 볼수 있는데요. 왜 쓰레기값인지 좀 설명해주세요....
: #include <stdio.h>
: #include <conio.h>
:
: void main(void)
: {
: int inp, i = 0;
: int *in = &inp;
: clrscr();
: for(i=0;i<5;++i){
: printf("\n%d",in+i); // in+i의 주소가 할당한 것을 보여줍니다.
: scanf("%d",(in+i));
: printf("\n : %d", *(in+i)); }
: getch();
: }
:
: 남병철.레조 님이 쓰신 글 :
: :
: : 안녕하세요? 레조입니다.
: :
: : 저는 빌더 5의 콘솔에서 컴파일해봤습니다.
: : 문제의 원인은 할당되지 않은 위치에 값을 넣어서 액세스 바이얼레이션이
: : 일어나지 않았나 생각됩니다.
: : 문제의 부분은 scanf이며 입력할 주소가 할당되지 않은 공간인데다가 계속
: : for루프를 돌면서 그 공간을 변화시키니... -_-;
: : C++이 아무리 느슨한 채킹을 한다고 해도 이건 좀 무리한게 아닌지요? ^^;
: : scanf("%d",(in+i) <-- 요부분...
: :
: :
: :
: : 김대의 님이 쓰신 글 :
: : : 우선 제가 배운걸 애기 하자면...
: : : 예를 들어 아래 프로그램을 보겠습니다.
: : : 제가 배운거는 아래처럼 포인터를 초기화 하면 포인터 in의 주소는 inp가 정수형이므로4byte씩 증가 합니다.즉 in의 주소가 1000이라면 in+1은 1004, in+2는 1008,in+3은 1012..로 4씩 증가하는걸로 압니다.
: : :
: : : 본론으로 들어가서............
: : : 아래 소스를 컴파일 시키면 이상한 16진수가 나오면서 에러 메세지가 뜨는데 왜 그런건가요.??
: : : 참고로 이런 메세지가뜨네요..
: : : thread stopped...... fault access violation at 0x406ec2:read of address 0x5
: : :
: : : 어쩔때는 컴이 아애 맛이 가버려요..ㅡㅡ 보통 이런 경우는 포인터에 주소를 지정안했을때 생기는 현상으로 알고있는데 전 분명히 위에서 처럼 포인터 초기화를 했는데...
: : : 이상한건 아래에서 프로그램처럼 in의 i번째에 입력과 출력을을 안하고,
: : : in에만 입력하고 출력을 하면 에러가 않뜨네요..ㅡㅡ;
: : :
: : : #include <stdio.h>
: : : #include <conio.h>
: : :
: : : void main(void)
: : : {
: : : int inp, i = 0;
: : : int *in = &inp;
: : : clrscr();
: : : for(i=0;i<5;++i){
: : : scanf("%d",(in+i) ); printf("\n : %d", *(in+i)); }
: : : getch();
: : : }
: : :
: : : 제가 잘못알고 있는 포인터 지식이 있다면 알려주십시요. 그리고 위 프로그램이 에러나는 원인좀 알려주세요..
: : :
|