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
[66984] Re:Re:구조체 초기화시 메모리 오류 문의
Kenzuro [kenzuro83] 1210 읽음    2012-04-23 10:45
장성호님 답변 감사합니다!!!



장성호 님이 쓰신 글 :
: String타입은 일반 기본 데이타형 이랑  다릅니다.
:
: Class입니다.
:
: int 형 같기 기본형은
:
: 특정 메모리를 integer 로 보겠다면 볼수 있지만
: String클래스는 변수의 크기는 4Byte입니다.
: 이 주소에는 실제 data(문자열)이 있는 위치의 주소가 들어갑니다.
:
:
: malloc 으로 메모리를 확보해 놓구
:
: 이제부터 여기는 String이다 라고 한다고 해서..
: 그놈이 String이 되지 않는다는 것이죠
:
:
: ==============================================
:
: 해결방법
: 방법1. malloc 을 쓰지 말고, 그냥 정적으로 선언해서 쓰던지
:
:
:     struct A
:    {
:      int a;
:  
:      B b[40]; //그냥 정적으로 선언해서...
:    };
:     AStruct A[40];
:    
: 

:
: 방법2.
:    아님 new로 할당해서 쓰시면 됩니다.
:
:     struct A
:    {
:      int a;
:  
:      B *b[40]; //포인터로 선언했으면
:      
:      Init()
:      {
:        for(int i=0;i<40;i++)
:        {
:             b[i]=new B; //New로 생성해서...
:         }
:      } 
:    };
: 
:   for(int i=0;i<40;i++)
:   A[i]=(A *)malloc(sizeof(A));
:   A[i]->Init();
: 

:   
:
: 방법1 추천
:
: 추신
:
:    앞에 말했듯이
:    String클래스는 크기가 4Byte입니다.
:    실제 data는 따로 저장되구요
:
:    내용에 상관없이 클래스 자체 크기는 4Byte입니다.
:    B구조체 안에 String변수를  포인터로 쓸 이유가 전혀 못 찾겠네요
:
:
: 그럼..
:
:
:
:
: Kenzuro 님이 쓰신 글 :
: : 안녕하세요 햇병아리 빌더 개발자입니다.
: :
: : RAD Studio XE로 모니터링 프로그램을 개발하고 있습니다.
: :
: : 여러 장비에서 들어오는 값들을 저장하기 위하여 헤더파일에 구조체를 선언하여 아래와 같이 프로그래밍을 했습니다.
: :
: :
public:
: : 
: :   struct A{
: :     int a;
: :     int b;
: : 
: :     B *b[40];
: :   };
: :   struct B{
: :     int a;
: :     AnsiString b;
: :   };

: :
: : 한 장비당 여러개의 셀이 들어있기 때문에 위와 같이 구조체 안에 구조체를 선언하여 만들었습니다.
: :
: : 그리고 실제 메모리를 생성해줬습니다.
: :
: :
for (int i = 0; i < 40; i++) {
: : 	A[i] = (A *)malloc(sizeof(A));
: : 	for (int j = 0; j < 40; j++) {
: : 		A[i]->B[j] = (B *)malloc(sizeof(B));
: : 	}
: : }
: : 

: : 여기까지 별 문제가 없이 메모리를 생성 하는 것 같았습니다.
: :
: : 오류도 워닝도 없이 컴파일도 잘 되었습니다.
: :
: :
for (int i = 0; i < 40; i++) {
: : 	A[i]->a = 0;
: :         A[i]->b = 0;
: : 	for (int j = 0; j < 40; j++) {
: : 		A[i]->B[j]->a = 0;
: : 		A[i]->B[j]->b = " ";
: : 	}
: : }

: : 그래서 위와 같이 기본값으로 초기화 하기 위해서 코딩을 했더니 메모리 오류가 나는 것입니다.
: :
: :
   A[i]->B[j]->b = " ";

: :
: : 이 코드를 주석 처리하면 정상적으로 메모리 오류가 나지 않습니다.
: :
: : 또는 for문의 i의 값을 40이 아니라 10개로 하면 오류가 나지 않습니다.
: :
: : 디버깅 해보니 for문의 i 값이 13정도가 되면 메모리 오류가 납니다..
: :
: : 메모리가 생성되지 않았나 싶어서 강제적으로
: :
: :
A[15]->B[23]->b = "test";

: :
: : 로 넣어보면 정상적으로 들어가 있습니다...
: :
: : 왜 이런현상이 일어나는지 궁금해서 미칠 지경입니다.. 조언좀 부탁드리겠습니다.

+ -

관련 글 리스트
66955 구조체 초기화시 메모리 오류 문의 Kenzuro 911 2012/04/20
66956     Re:구조체 초기화시 메모리 오류 문의 장성호 1093 2012/04/20
66984         Re:Re:구조체 초기화시 메모리 오류 문의 Kenzuro 1210 2012/04/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.