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 자료형과 배열의 크기로)정해주었기 때문에 가능했지 않았나 생각합니다. 그래도 이번 기회로 포인터에 대해 확실히 알게 되었네요. 하지만... 너무 부끄럽습니다. >_<
덧붙임
지금 보니까 코드 자체도 의미적으로 전혀 말이 안 되는군요. >_<"0x08 과거의 글모음 / 내 머리 속의 노트" 분류의 다른 글
| 블로그(텍스트큐브) 서버를 직접 만들어보기 - OS & Package 설치 | 2011/02/16 |
| C/Linux :: 리눅스에서 파일 덤프... dump.c | 2010/12/05 |
| C/Linux :: ls -l 을 수행하는 ll.c | 2010/10/30 |
| python :: Socket Communication with Thread | 2010/10/10 |
| 리눅스(우분투)에서 부경대학교 무선랜 접속하기 | 2010/07/19 |
Trackback Address:http://hisjournal.net/blog/trackback/158
32bit 운영체제에서 포인트는 4byte 인걸 알면서도
저도 저 소스 보면서 순간 헷갈렸네요. 형타입에 상관없이
포인트는 포인트일뿐인데요 ^^;
주인장님께서 허락하신 다면, 이 포스트 내용과 관련 소스를 제가 가져다가 써도
괜찮을런지요?
소스가 허접해서... ^^; 출처만 표기해주신다면 CCL에 따라 이용하셔도 괜찮습니다.