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 자료형과 배열의 크기로)정해주었기 때문에 가능했지 않았나 생각합니다. 그래도 이번 기회로 포인터에 대해 확실히 알게 되었네요. 하지만... 너무 부끄럽습니다. >_<
덧붙임
지금 보니까 코드 자체도 의미적으로 전혀 말이 안 되는군요. >_<"#1. 내 머리 속의 노트 / C 언어 마스터 Go! gO!" 분류의 다른 글
| C언어 난관 2 [열혈강의 C p.115] char_add.c (8) | 2010/02/23 |
| C :: typedef으로 함수 포인터를... (2) | 2009/08/25 |
| C :: null 포인터, null 문자, 정수 0에 관한 이야기 (2) | 2009/06/24 |
| C :: srand(time(null)) 과 usleep() 함수 (4) | 2009/04/11 |
| C :: 0xE0 == 224 ? (0) | 2009/03/03 |
| C :: 1byte씩 메모리 읽기 (2) | 2009/02/28 |
| C :: 실수(Float)를 엿보려면 컴퓨터를 속여라. (4) | 2009/02/15 |
| C :: multiple definition 에러 (0) | 2009/02/01 |
| C :: 컴퓨터와 가위바위보를 하자. - 코딩편 (0) | 2009/01/17 |
| C :: 컴퓨터와 가위바위보를 하자. - 설계편 (0) | 2009/01/16 |
Trackback Address:http://hisjournal.net/blog/trackback/158
32bit 운영체제에서 포인트는 4byte 인걸 알면서도
저도 저 소스 보면서 순간 헷갈렸네요. 형타입에 상관없이
포인트는 포인트일뿐인데요 ^^;
주인장님께서 허락하신 다면, 이 포스트 내용과 관련 소스를 제가 가져다가 써도
괜찮을런지요?
소스가 허접해서... ^^; 출처만 표기해주신다면 CCL에 따라 이용하셔도 괜찮습니다.