운이 좋다면 *int_ptr = 10;을 했을 때 바로 죽어주겠지만..
운이 안좋다면 그대로 진행해서 엄한 곳에서 죽을 것입니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
일단 baboda4u 님의 글에 대해 말씀드리면
malloc (size) 는 size 만큼의 memory 를 달라는 것입니다. 해당 memory를 어떤 구조로 사용할지, 어떻게 사용할지 등은 아무 신경도 쓰지 않고, 관심도 없습니다.
그리고 sizeof 는 단순히 해당 변수가 담기기 위한 크기를 돌려줍니다. 실제 그 변수가 어디에 저장되었는지 사용 가능한지 등등에는 아무 관심 없습니다.
따라서 malloc 하지 않고, int_ptr = NULL 로 하셔도 sizeof 하시면 4 라고 리턴합니다.
컴파일러는 malloc 에서 할당한 크기와 실제 그 변수가 access 하는 크기에 대해서는 알 수도 없고, 그에 따라 warning 이나 error 는 내지도 않습니다. 실제 돌려 보면 엄한 오류로 죽거나 오동작하거나 하는 것이지요. 이런 것은 오로지 작성자가 책임을 지고 관리해야만 합니다. (예 C 언어가 괜히 메모리 관리가 어렵다는게 아니지요...)
그럼에도 불구하고, baboda4u 님의 코드는 대부분의 시스템에서는 별 문제가 없을 것입니다. 그 이유는 malloc 에서 돌려주는 memory의 크기가 딱 원하는 만큼만 주는 것이 아니기 때문입니다. 보통 관리의 편의를 위해 4byte 또는 8byte 단위로 할당해 줍니다. (게다가 할당 최소 크기는 8byte ~ 16byte 정도 됩니다.) 즉 malloc(21) 이라고 해서 딱 21byte 만큼만 쓸 수 있는 것이 아니라 24 byte 까지는 사용해도 별 문제가 없는 경우가 대부분이라는 것이지요. (하지만 그렇게 사용하는 것이 옳은 사용법이 아니기 때문에, 항상 그렇다고 보장할 수는 없습니다!!!)
int* 는 32bit 환경에서 32bit 사이즈 일겁니다.
char* 는 32bit 환경에서 32bit 사이즈 일겁니다.
struct _blahblah* 는 32bit 환경에서 32bit 사이즈 일겁니다.
(스트럭트 문법을 잘 모르겠네요. typedef만 보다보니;;)
간단하게는... 포인터의 sizeof 를 검색해 보시면 될듯 합니다.
int 와 int*는 다른거고
char와 char*도 다른거고
struct _blahblah와 struct blahblah* 도 다른걸로 알고있습니다.
void * 가 없던, ANSI 이전에는 malloc() 에서 명시적으로 type casting 을 해줘야 했지만..
ANSI/ISO 에서는 void * 는 자동으로 casting 되기 때문에 굳이 그럴 필요는 없습니다..
다만, 다양한 컴파일러 환경에 적용해야 한다거나, C++ 을 사용하는 경우에는..
compiler warning 이나 호환성을 고려해서 명시적으로 casting 을 해주는 것이 좋을 것 같습니다.
그리고 sizeof 는 컴파일 환경에 따라 data-type 의 크기가 가변적인 환경에서 이식성을 위해 나온 것이라..
pointer 로 data size 를 계산할 수 없습니다.
type casting
type casting
typecast해줘야 하구요!!!!!
하지만 저두 궁금한점 생겨 버렸다는...
int * int_ptr = (int *) malloc(2);
이렇게...int형임에도 불구하고 2bytes를 할당 받은 후
sizeof(*int_ptr)하면...4라고 나오내요....
=_=?? 컴파일러가 알아서 2bytes채워 줄것 같지는 않고..-_-;
함수 원형 한번 보러 가야 겠습니다.
============================
Stay Hungry, Stay Foolish
컴파일 에러는
컴파일 에러는 안납니다. 대신 논리적 문제가 생깁니다.
메모리는 2바이트를 할당했지만 4바이트를 사용하는 int형으로 캐스팅 했습니다.
운이 좋다면 *int_ptr = 10;을 했을 때 바로 죽어주겠지만..
운이 안좋다면 그대로 진행해서 엄한 곳에서 죽을 것입니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
하지만 대부분의 경우엔 문제가 안 일어납니다.
일단 baboda4u 님의 글에 대해 말씀드리면
malloc (size) 는 size 만큼의 memory 를 달라는 것입니다. 해당 memory를 어떤 구조로 사용할지, 어떻게 사용할지 등은 아무 신경도 쓰지 않고, 관심도 없습니다.
그리고 sizeof 는 단순히 해당 변수가 담기기 위한 크기를 돌려줍니다. 실제 그 변수가 어디에 저장되었는지 사용 가능한지 등등에는 아무 관심 없습니다.
따라서 malloc 하지 않고, int_ptr = NULL 로 하셔도 sizeof 하시면 4 라고 리턴합니다.
컴파일러는 malloc 에서 할당한 크기와 실제 그 변수가 access 하는 크기에 대해서는 알 수도 없고, 그에 따라 warning 이나 error 는 내지도 않습니다. 실제 돌려 보면 엄한 오류로 죽거나 오동작하거나 하는 것이지요. 이런 것은 오로지 작성자가 책임을 지고 관리해야만 합니다. (예 C 언어가 괜히 메모리 관리가 어렵다는게 아니지요...)
그럼에도 불구하고, baboda4u 님의 코드는 대부분의 시스템에서는 별 문제가 없을 것입니다. 그 이유는 malloc 에서 돌려주는 memory의 크기가 딱 원하는 만큼만 주는 것이 아니기 때문입니다. 보통 관리의 편의를 위해 4byte 또는 8byte 단위로 할당해 줍니다. (게다가 할당 최소 크기는 8byte ~ 16byte 정도 됩니다.) 즉 malloc(21) 이라고 해서 딱 21byte 만큼만 쓸 수 있는 것이 아니라 24 byte 까지는 사용해도 별 문제가 없는 경우가 대부분이라는 것이지요. (하지만 그렇게 사용하는 것이 옳은 사용법이 아니기 때문에, 항상 그렇다고 보장할 수는 없습니다!!!)
허허... 이런 짓궂은 아저씨를 봤나...
하이 몰라씨...
초보자한테 그런 위험한 거 가르쳐주면 못써요... -.-;;
제가 헤멨던거랑 같은 문제네요.
학생때 무지 헤멨...다가 선배가 알려줬던...
int* 는 32bit 환경에서 32bit 사이즈 일겁니다.
char* 는 32bit 환경에서 32bit 사이즈 일겁니다.
struct _blahblah* 는 32bit 환경에서 32bit 사이즈 일겁니다.
(스트럭트 문법을 잘 모르겠네요. typedef만 보다보니;;)
간단하게는... 포인터의 sizeof 를 검색해 보시면 될듯 합니다.
int 와 int*는 다른거고
char와 char*도 다른거고
struct _blahblah와 struct blahblah* 도 다른걸로 알고있습니다.
제가 틀린소리를 지껄여 놓은거라면, 다른 분들이 '떼끼놈!' 해 주실거라 믿으며..;;
음....포인터의 sizeof는....
모든 포인터의 size는 4bytes입니다.
int, float, char 타입 상관없이 포인터는 주소를 가리키기때문에 4bytes입니다.
즉 4bytes로 주소를 엑세스 한다는 거죠...
제가 궁금한거는 int형 4bytes인데 malloc로 2bytes만 할당한다면? 이라는 문제죠...^^;
============================
Stay Hungry, Stay Foolish
============================
Stay Hungry, Stay Foolish
_
sizeof가 malloc을 신경써줄 수는 없습니다. sizeof는 단순히 컴파일 시점에서 크기를 알려줄 뿐입니다. 예를 들어..
char a[10]; // sizeof(a) == 10*sizeof(char)
char* b = a; // sizeof(b) == sizeof(char*)
그리고 포인터 크기가 4바이트인 건 대부분이 그럴 뿐 표준에 정의된 것이 아닙니다. http://kldp.org/node/39915#comment-134120
음...
void * 가 없던, ANSI 이전에는 malloc() 에서 명시적으로 type casting 을 해줘야 했지만..
ANSI/ISO 에서는 void * 는 자동으로 casting 되기 때문에 굳이 그럴 필요는 없습니다..
다만, 다양한 컴파일러 환경에 적용해야 한다거나, C++ 을 사용하는 경우에는..
compiler warning 이나 호환성을 고려해서 명시적으로 casting 을 해주는 것이 좋을 것 같습니다.
그리고 sizeof 는 컴파일 환경에 따라 data-type 의 크기가 가변적인 환경에서 이식성을 위해 나온 것이라..
pointer 로 data size 를 계산할 수 없습니다.
http://en.wikipedia.org/wiki/Sizeof
http://en.wikibooks.org/wiki/C_Programming/Pointers_and_arrays#sizeof
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기