|
김대의 님이 쓰신 글 :
: 배열을 사용해서 할려는게 아닌데요..ㅡㅡ;
:
: 포인터를 사용해서 배열처럼 사용하는건데..
:
: 그리고 포인터는 배열처럼 공간을 미리 할당안해되되는 장점이 있는걸루 아는데요..ㅡㅡ;
포인터는 미리 할당한 공간의 주소에만 의미가 있습니다.
프로그램에서 미리 할당하지 않은 공간의 주소를 액세스하면 절대로 안됩니다!
포인터에 대한 초보들의 흔한 실수죠. 주의하세요.
프로그램이 오동작을 하거나 이유없이 죽어버리는 경우 중에 제일 흔한 경우가 이런 경우입니다.
포인터가 할당한 공간외에 엉뚱한 주소를 액세스하는가를 항상 의심해야 합니다.
그래서, 이런 디버깅을 도와주는 전문 프로그램인
Bounds Checker나 Code Guard(C++Builder에 포함되어 있습니다.)와 같은 프로그램은
그래서 있는 겁니다.
: 먼자 잘못아신거 같네요..ㅡㅡ;
:
: : :
: : : #include <stdio.h>
: : : #include <conio.h>
: : :
: : : void main(void)
: : : {
: : : int inp, i = 0;
: : int inp[5], i; // 배열로 선언해서 미리 필요한 공간을 할당해야 합니다.
정적으로 배열을 선언할 수 없는 경우는
malloc()함수나 new 연산자를 사용하여 동적으로 할당하면 됩니다.
int *in = (int*)malloc(5 * sizeof(int)); // C 방식
int *in = new int[5]; // C++ 방식
: : 그렇지 않으면 엉뚱한 메모리에 데이터를 쓰게 되므로 이상한 값이 출력되거나,
: : 프로그램이나 시스템을 다운시킬 수 있습니다!
: :
: : : // int *in = &inp; 이 부분은 삭제하세요.
: : : clrscr();
: : : for(i=0;i<5;++i){
: : : scanf("%d",(in+i) ); printf("\n : %d", *(in+i)); }
여기서 물론
scanf("%d", &in[i] ); printf("\n : %d", in[i]));
으로 써도 되는 건 아실테죠?
그리고 malloc()이나 new로 할당한 메모리는,
포인터 in을 사용한 블럭이 끝나기 전에
free() 함수나 delete 연산자를 써서
할당한 메모리를 해제해야 합니다.
(가능하면 더 이상 사용할 필요가 없을 때 바로 해제하세요.)
여기서 주의할 것은,
malloc()으로 할당한 메모리는 free()로,
new로 할당한 메모리는 delete로 해제해야 합니다.
틀리게 하면 안됩니다!
free(in); // C 방식
delete[] in; // C++ 방식
: : : getch();
: : : }
: :
: : 앞으로 이런 종류의 질문은
: : Turbo C/Borland C++ Q/A에 해주세요!
|