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

C++빌더 Q&A
C++Builder Programming Q&A
[54436] Re:Re:Re:STL 에서 find 관련 질문
둘리 [dooly386] 1211 읽음    2008-08-28 00:26
바뀌는게 아니라 미확정(할당되지 않은) 메모리 억세스가 되는 것 입니다.

STL 의 fild는 해당 값을 찾지 못하면 end() 를 출력합니다. 이 end() 는 마지막 의 다음인데.. 님의 예에서는 배열을 사용했습니다.
STL 의 end는 마지막의 다음 메모리 입니다.
경우에 따라서 다릅니다.'
find 함수가 (아니 모든 STL의 경우) 범용성을 가지고 있습니다. 이는 list 나 stack 등 의 근본 기술인 sequence한 데이터들을 범용적으로 다룹니다.
배열의 경우는 end() 는 배열 마지막 주소의 다음 주소가 됩니다.
아래의 경우 int 이기 때문에 주소 자체는 4 byte 아래쪽을 가리킵니다.

값이 변한다는 것은 할당된 메모리에대해서 예측 가능하지 할당 되지 않은 부분에 대해서는 예측 할 수 없다는 것이죠..
어느 다른 부분이 사용할 수도 있으니까요..

주소를 출력하셨는데.. +1 일경우 주소는 모두 4바이트 아래씩 지칭하고 있습니다.

주소는 이렇게 정해지지만 그 값은 할당이 않된경우 의미가 없는 것이죠..
find 를 호출하면 내부적으로 많은 프로세스루틴이 돌겠죠.. 그러다 바뀔 수 있다는 것이죠..

의미없는 메모리에 대하여 관심을 집중할 필요는 없다고 봅니다.



크레브 님이 쓰신 글 :
: 배열의 length overflow를 질문한것은 아닙니다.
: find 함수가 원하는 값을 찾지 못했을때 last Iterator리턴하는데..
: 그것이 가리키는 값을 바꾸어 버리는가 하는 점이죠
:
: find 함수 호출후 우연히 마지막 iterator 위치의 값(처음엔 쓰레기값)이 찾고자 했던 값(15)으로 바뀐것 같네요
:
:
:
: Lyn 님이 쓰신 글 :
: : 소스 자체가 오류입니다.
: :
: : a[10] 이라고 선언했으면 a[0]~a[9] 까지 존재하지 a[10]은 Length over 입니다
: : a+10도 마찬가지구요
: :
: : 그리고 마지막 이터레이터는 접근하면 안되는값입니다.
: : < 연산으로 끝을 점검 하기 위해 존재하는 마지막값 다음을 가르키게 되어 있거든요 ㅡ.ㅡ;
: :
: : 크레브 님이 쓰신 글 :
: : : 요즘 STL 조금 보고 있는데..
: : : 이상한 부분이 있어서 따로 질문할데도 없고해서 여기에 올립니다.
: : :
: : : 아래 소스 실행해 보시면
: : : find 함수 실행후에  할당도 안된 메모리인 a[10] 의 내용이 변하는것을 알수 있습니다.
: : : find 알고리즘이 찾은 내용이 없을때 last Iterator의 값을 바꾸어 버리는건가요?
: : :
: : :
 
: : : //---------------------------------------------------------------------------
: : : 
: : : #pragma hdrstop
: : : 
: : : #include 
: : : #include 
: : : #include 
: : : #include 
: : : #include 
: : : 
: : : using namespace std;
: : : 
: : : 
: : : 
: : : //---------------------------------------------------------------------------
: : : 
: : : #pragma argsused
: : : int main(int argc, char* argv[])
: : : {
: : :    int a[10] = {1, 2, 3, 4, 5 , 6, 7, 8, 9 , 10};
: : : 
: : :    int * ptr;
: : : 
: : :    printf("pointer of (a+10) = %02p\n", a+10);
: : :    printf("value of (a+10) = %d\n", *(a+10));
: : : 
: : :    ptr = find(a , a+10, 9);
: : :    printf("%02p\n", ptr);
: : :    cout <<"<----result=" << *ptr << endl;
: : : 
: : :    ptr = find(a , a+10, 10);
: : :    printf("%02p\n", ptr);
: : :    cout <<"<----result=" << *ptr << endl;
: : : 
: : :    ptr = find(a , a+10, 15);
: : :    printf("%02p\n", ptr);
: : :    cout <<"<----result=" << *ptr << endl;
: : : 
: : :    cout <<"result=" << *ptr << endl;
: : :    cout <<"result+1=" << *(ptr+1) << endl;
: : :    cout <<"result+2=" << *(ptr+2) << endl;
: : :    cout <<"result+3=" << *(ptr+3) << endl;
: : : 
: : :    printf("value of (a+10) = %d\n", *(a+10));
: : :    printf("value of (ptr) = %d\n", *ptr);
: : : 
: : :    
: : : //   list list1(a , a+10);
: : : //   cout << "count=" << list1.size();
: : :    //list::iterator i =
: : : 
: : :    getch();
: : :    return 0;
: : : }
: : : //---------------------------------------------------------------------------
: : : 
: : :  

: : :
: : : 실행 결과
: : :
 
: : : 
: : : pointer of (a+10) = 0013FF7C
: : : value of (a+10) = 4472480
: : : 0013FF74
: : : <----result=9
: : : 0013FF78
: : : <----result=10
: : : 0013FF7C
: : : <----result=15
: : : result=15
: : : result+1=10
: : : result+2=9
: : : result+3=1310588
: : : value of (a+10) = 15
: : : value of (ptr) = 15
: : :  

+ -

관련 글 리스트
54432 STL 에서 find 관련 질문 크레브 1009 2008/08/27
54434         Re:Re:STL 에서 find 관련 질문 크레브 1049 2008/08/27
54436             Re:Re:Re:STL 에서 find 관련 질문 둘리 1211 2008/08/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.