C :: 포인터는 포인터일뿐 이상도 이하도 아닙니다.

2009/02/13 18:31

어느 한 분이 게시판에 다음과 같이 질문을 올렸습니다.

typedef struct _StrBur
{
    UCHAR UniBuf[256];
    CHAR AsBuf[256];
}StrBur,* pStrBur;

이런식으로 있다고 합시다.

StrBur a;

이렇게 선언하면, 확실히 256*3의 매모리가 들어가고 a. 이런식으로 접근 할수 있잔아요...
근데

pStrBur b;

이런식으로 선언하면 4바이트 짜리 포인터 하나만 선언 되는건가요?
아니면

pStrBur b;
b -> ^#^^$#^$#

이런식으로 접근 할수 있게 데이터를 넣을 공간까지 같이 선언 되는건가요?

구조체 포인터에 관한 질문입니다. 이 분께 조금이나마 도움을 드리기 위해 간단한 예제를 만들었죠.

#include <stdio.h>

typedef struct
{
char strA[256];
char strB[256];
} Str, *pStr;

int main(void)
{
Str name;
pStr college;

printf("name size: %dbyte, college size: %dbyte, *college size: %dbyte \n",
sizeof(name), sizeof(college), sizeof(*college));

return 0;
}

그리고 아래와 같은 결과가 나왔습니다.

사용자 삽입 이미지

그래서 전 이분께 당당하게 이렇게 답해드렸습니다.

구조체를 선언하면서 구조체 포인터도 선언하였기 때문에 구조체에 접근할 수 있는 메모리가 생성됩니다.

(쿨럭... 여기서 뭐냐 이 망발은? 하시겠지만, 끝까지 읽어주시와요.)그리고 다른 분이 여기에 답글을 달았습니다.

구조체 포인터가 가리키는 구조체(*college)의 크기를 알 수 있다고 해서 접근할 수 있는 메모리가 생성되는 것은 아닙니다.

포인터는 포인터일뿐 이상도 이하도 아닙니다.

전 도저히 이해를 못 하겠더군요. 크기를 알 수 있는데, 메모리가 생성된 게 아니라니? 그래서 실제로 위 코드로 접근을 시도해봤습니다. 그런데 Segmentation fault 에러만 나오네요. 에? 아우~~ 부끄러워라... >_<

위 코드에서 실제 데이터에 접근하려면,

college = &name;

이런 식으로 먼저 포인터에 실제 변수의 번지를 대입해야 하는거죠. 구조체의 크기를 알 수 있던 것은 아마 선언에서 크기를 (char 자료형과 배열의 크기로)정해주었기 때문에 가능했지 않았나 생각합니다. 그래도 이번 기회로 포인터에 대해 확실히 알게 되었네요. 하지만... 너무 부끄럽습니다. >_<

덧붙임

지금 보니까 코드 자체도 의미적으로 전혀 말이 안 되는군요. >_<
크리에이티브 커먼즈 라이센스
Creative Commons License

6l4ck3y3 0x08 과거의 글모음/내 머리 속의 노트 , , ,

Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 32bit 운영체제에서 포인트는 4byte 인걸 알면서도

    저도 저 소스 보면서 순간 헷갈렸네요. 형타입에 상관없이

    포인트는 포인트일뿐인데요 ^^;

    주인장님께서 허락하신 다면, 이 포스트 내용과 관련 소스를 제가 가져다가 써도

    괜찮을런지요?

  2. Blog Icon
    6l4ck3y3

    소스가 허접해서... ^^; 출처만 표기해주신다면 CCL에 따라 이용하셔도 괜찮습니다.

[로그인][오픈아이디란?]