|
아하 그렇군요 이제야 명확해 지는 군요~
답변 해주신 모든 분들 감사드립니다(--)(__)(--)
Nibble 님이 쓰신 글 :
: 포인터 선언과 배열 선언은 다릅니다.
: 포인터도 배열의 태그 표현을 사용할 수 있다는 것,
: 배열도 주소를 표현한다는 것만 같습니다.
:
: 구조체{
: 타잎*a;
: 타잎 b[];
: }
: 이 둘의 차이는
: a 의 경우 전역선언이아닌 이상, 쓰레기 값이 들어 있는 포인터입니다.
: b 의 경우, 구조체내에서 b의 위치에 해당하는 주소값을 갖게 됩니다.
: a[0] 이라고 하면 a 의 내용이 가리키는 쓰레기 주소값의 첫 데이타를 말하고,
: b[0] 이라고 하면 b 가 위치한 주소의 첫 데이타를 말하게 되죠.
:
: 배열 선언은 상수 그 자체이고 메모리 공간을 따로 할당하지 않습니다.
: 포인터 선언은 그 자체가 word 크기의 (WORD 매크로와 다릅니다) 변수일 뿐입니다.
:
: 그 내용을 참조하느냐, 그 주소 자체냐의 차이라고 다시 한번 말씀 드립니다.
: 말씀하신 경우는 배열로 선언해서 다음 주소들을 가리키게 함이 맞구요
: 굳이 포인터로 선언하셨다면 *S = &S + sizeof(S); 처럼 해 놓고 S[0] 처럼 쓰셔야 하고
: 4바이트 낭비가 생깁니다.
:
: 한수동 님이 쓰신 글 :
: : 별도로 하라는 말씀은 sizeof(P_t) - sizeof(S_t *) + (sizeof(S_t) * Count); 에서
: : -sizeof(S_t *) 부분을 빼라는 말씀이신가요? 흠.. 해봤는데요 안되네요;;
: :
: :
: : 강신영.Divinespear 님이 쓰신 글 :
: : : Proto->S 는 그냥 포인터로 선언되어 있기 때문에, 메모리를 별도로 할당하셔야 합니다.
: : :
: : : 한수동 님이 쓰신 글 :
: : : : typedef struct {
: : : : unsigned char T;
: : : : unsigned char S;
: : : : unsigned short M;
: : : : }S_t;
: : : :
: : : : typedef struct {
: : : : unsigned short H;
: : : : unsigned char M;
: : : : S_t *S;
: : : : } P_t;
: : : :
: : : : int Count = 사용자가 원하는 만큼의 수;
: : : : int TotalSize = sizeof(P_t) - sizeof(S_t *) + (sizeof(S_t) * Count);
: : : : P_t *Proto = (P_t *) new unsigned char[TotalSize];
: : : :
: : : : 제가 S_t 라는 스트럭쳐를 하나 만들고요
: : : : 그리고 P_t 라는 스트럭쳐에
: : : : S_t 스트럭쳐 하나를 포인터로 선언 했습니다
: : : :
: : : : 그리고 나서 new 를 이용해서 제가 원하는 사이즈만큼 메모리 공간을 잡았습니다
: : : : (Count는 제가 원하는 S_t의 수입니다)(이렇게 한 이유는 S_t가 몇개가 필요한지 모르기 때문입니다)
: : : :
: : : : 그리고 나서 Proto->S[0].T 이런식으로 불러내면 자동완성 기능에는 문제 없이 뜨고 컴파일도 잘 되는데
: : : :
: : : : 이상하게 프로그램상에서 Proto->S[0].T 구문을 부르려고 하면 자꾸 Memory Violation 이 뜹니다 왜 그런거죠?
: : : :
: : : : 그래서 스트럭쳐에 있는 S를 포인터로 잡지 않고 S[] 이런 배열 식으로 잡으니까 되네요;; 포인터로 잡으나 배열로 잡으나 같은 포인터인데 왜 그런지 모르겠네요 ㅡㅡ;;
: : : : (혹시나 해서 #pragma pack 으로 묶어 보기도 했습니다)
|