Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[732] Re:포인터에 대해 잘 아시는분 답변좀해주세요..제가 알고 있는 것의 문제점도 지적해주세요..(참고로 컴
오전&오후 [kkhhyy11] 1794 읽음    2002-06-10 09:07
포인터를 잘못사용하고 계시네요....
우선 메모리 공간할당이라는걸 말해보지요..
변수를 선언시 시스템(OS)에서 공간을 할당하지요, 즉 이공간은 지금 사용하지않는 메모리 공간을
알아서 잡아줍니다.
int i; <--- 이것은 4byte의 메모리 공간이 잡히는 거죠..즉 딱 4byte만 잡히는 겁니다..메모리
번지가 1000번지라면 절대적으로 1000 에서 1003까지는 메모리가 다른데서 사용을 안하고 있기
때문에 시스템에서 잡아준거죠. 1003이후의 메모리 번지는 비어있을수도 아님 중용한 데이타가
들어가 있을수도 있습니다. 이것은 모르는거죠. 컴파일해서 잘돌아가시는 분들은 1003이후에
운이좋게도 빈공간일 경우에 그렇습니다. 이건 정말 운이 좋은거죠. 잘못하면 시스템다운 까지
가게 되니까요...ㅡ,.ㅡ;
(그런데 이거 빌더로 돌리면 waring이 안나오나요..??? gcc에서는 100% 경고나오는디..-Wall옵셩 켰을때..ㅡ,.ㅡ)

그런데 님은 안전하게 영역을 잡으신것은 정수형변수 선언시 4byte밖에 안전하게 메모리를 잡으시고
그뒤로의 영역에도 데이타를 쓸려고 하기 때문에 문제가 생기는 겁니다..
즉 문제가 생길수도 있고 안생길수도 있습니다. 이건 프로그래머의 몫입니다. 이런부분이 나중에
치명적인 문제를 일으킬때가 많습니다가..반드시 일어납니다...
예를 들어
int i[10]; <--- sizeof(int)만큼 메모리 영역을 잡았지요..
그런데 int i[11]부분에 데이타를 쓸려고 하면 어떻게 될까요..??
님께서 하신방법이 이거하고 같다고 생각하시면 될겁니다..

저도 실수로 정수배열을 10개잡아주고 계속해서 15개까지의 데이타를 기록했는데..
(정말 몰랐어요..ㅡ,.ㅡ;;)
나중에 문제가 생겼지요...시스템 다운이라는...ㅡ,.ㅡ;;

김대의님 포인터를 사용할때는 정말로 조심해서 사용하셔야 합니다..
프로그래머가 정말로 신경을 많이 써야할부분입니다..

그림으로 설명
#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();
}
      번지값

    |--->  1000 | int inp |   <--- int inp 설정시잡힘(4byte) --|
    |      1001 |         |                                    |---4byte
    |      1002 |         |                                    |
    |      1003 |         |   <--------------------------------|
    |      1004 |         |   <--- 이부분부터는 알수없는 영역 즉 데이타가 있을수도 있고
    |      1005 |         |        없을수도 있습니다.
    |      1006 |         |
    |
    |               ~  
    |
    |      2002 | int i   |  <----- int i(4byte)
    |      2003 |         |
    |      2004 |         |
    |      2005 |         |
    |               ~     
    |
    |------3000 | int *in (1000) |  <--- 포인터 변수의 공간이 하나 잡히지요..여기에는
                                          inp의 번지값이 들어가 있지요..
     
     in + 1 하면 1004번지를 가르키죠..?
     우선은 in + 1으로 메모리 공간이 할당이 되는게 아니라 메모리 번지이동입니다..
     이것을 공간할당으로 잘못이해하시는거 같은데 단순히 1000번지에서 1004번지
     메모리 번지를 이동하는겁니다..
     그러니까 대의님은 4byte영역만 확보하고 4byte가 넘어선 메모리 영역을(알수없는영역)
     을 침범한게 되는겁니다.
     ps)
     각각의 변수로 선언시 각각 변수값은 메모리 번지에 연속적으로 할당이 되는게
     아니라 OS에서 알아서 잡아줍니다..
     그러나 배열을 선언시에는 연속적인 메모리 공간이 할당이 되죠..
     님처럼 메모리 번지를 엑세스 하실려면 벼열로 선언하시던가
     아님 동적메모리 할당을 사용하셔야 합니다.
   

김대의 님이 쓰신 글 :
: 우선 제가 배운걸 애기 하자면...
: 예를 들어 아래 프로그램을 보겠습니다.
: 제가 배운거는 아래처럼 포인터를 초기화 하면 포인터 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();
: }
:
: 제가 잘못알고 있는 포인터 지식이 있다면 알려주십시요. 그리고 위 프로그램이 에러나는 원인좀 알려주세요..
:

+ -

관련 글 리스트
714 포인터에 대해 잘 아시는분 답변좀해주세요..제가 알고 있는 것의 문제점도 지적해주세요..(참고로 컴파일 김대의 1769 2002/06/08
732     Re:포인터에 대해 잘 아시는분 답변좀해주세요..제가 알고 있는 것의 문제점도 지적해주세요..(참고로 컴 오전&오후 1794 2002/06/10
727     Re:포인터에 대해 잘 아시는분 답변좀해주세요..제가 알고 있는 것의 문제점도 지적해주세요..(참고로 컴 꼴(이성렬) 1786 2002/06/09
718     Re:포인터에 대해 잘 아시는분 답변좀해주세요..제가 알고 있는 것의 문제점도 지적해주세요..(참고로 컴 남병철.레조 1829 2002/06/09
720         Re:Re:포인터에 대해 잘 아시는분 답변좀해주세요..제가 알고 있는 것의 문제점도 지적해주세요..(참고 김대의 1806 2002/06/09
721             Re:Re:Re:포인터에 대해 잘 아시는분 답변좀해주세요..제가 알고 있는 것의 문제점도 지적해주세요..( 남병철.레조 1868 2002/06/09
715     어디서 돌렸나요? 모라 1774 2002/06/09
728         Re:어디서 돌렸나요? 꼴(이성렬) 1827 2002/06/09
746             Re:Re:어디서 돌렸나요? ¸ð¶ó 1836 2002/06/13
717         Re:어디서 돌렸나요? (컴파일러 환경은 bc5.01입니다.), 도스용 tc에서는 오류가 없을거에요.^^ 김대의 1792 2002/06/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.