|
김백일 님이 쓰신 글 :
: 김대의 님이 쓰신 글 :
: : 배열을 사용해서 할려는게 아닌데요..ㅡㅡ;
: :
: : 포인터를 사용해서 배열처럼 사용하는건데..
: :
: : 그리고 포인터는 배열처럼 공간을 미리 할당안해되되는 장점이 있는걸루 아는데요..ㅡㅡ;
:
: 포인터는 미리 할당한 공간의 주소에만 의미가 있습니다.
: 프로그램에서 미리 할당하지 않은 공간의 주소를 액세스하면 절대로 안됩니다!
: 포인터에 대한 초보들의 흔한 실수죠. 주의하세요.
:
: 프로그램이 오동작을 하거나 이유없이 죽어버리는 경우 중에 제일 흔한 경우가 이런 경우입니다.
: 포인터가 할당한 공간외에 엉뚱한 주소를 액세스하는가를 항상 의심해야 합니다.
: 그래서, 이런 디버깅을 도와주는 전문 프로그램인
: 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에 해주세요!
|