malloc에 대해 궁금한점이 있습니다.

mtgfaw의 이미지

궁금한게 생겨서요 ㅜㅜ

struct mill me;

ptr = (me*)malloc(sizeof(me));

여기서 (me*)가 의미하는 것이 무엇인가요?

써도되고 안써도 되는것 같은데.

haze11의 이미지

type casting

baboda4u의 이미지

하지만 저두 궁금한점 생겨 버렸다는...

int * int_ptr = (int *) malloc(2);

이렇게...int형임에도 불구하고 2bytes를 할당 받은 후

sizeof(*int_ptr)하면...4라고 나오내요....

=_=?? 컴파일러가 알아서 2bytes채워 줄것 같지는 않고..-_-;

함수 원형 한번 보러 가야 겠습니다.

============================
Stay Hungry, Stay Foolish

chadr의 이미지

컴파일 에러는 안납니다. 대신 논리적 문제가 생깁니다.

메모리는 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.

molla의 이미지

일단 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 까지는 사용해도 별 문제가 없는 경우가 대부분이라는 것이지요. (하지만 그렇게 사용하는 것이 옳은 사용법이 아니기 때문에, 항상 그렇다고 보장할 수는 없습니다!!!)

jick의 이미지

하이 몰라씨...

초보자한테 그런 위험한 거 가르쳐주면 못써요... -.-;;

seungrye의 이미지

학생때 무지 헤멨...다가 선배가 알려줬던...

int* 는 32bit 환경에서 32bit 사이즈 일겁니다.
char* 는 32bit 환경에서 32bit 사이즈 일겁니다.
struct _blahblah* 는 32bit 환경에서 32bit 사이즈 일겁니다.
(스트럭트 문법을 잘 모르겠네요. typedef만 보다보니;;)

간단하게는... 포인터의 sizeof 를 검색해 보시면 될듯 합니다.

int 와 int*는 다른거고
char와 char*도 다른거고
struct _blahblah와 struct blahblah* 도 다른걸로 알고있습니다.

제가 틀린소리를 지껄여 놓은거라면, 다른 분들이 '떼끼놈!' 해 주실거라 믿으며..;;

baboda4u의 이미지

모든 포인터의 size는 4bytes입니다.

int, float, char 타입 상관없이 포인터는 주소를 가리키기때문에 4bytes입니다.

즉 4bytes로 주소를 엑세스 한다는 거죠...

제가 궁금한거는 int형 4bytes인데 malloc로 2bytes만 할당한다면? 이라는 문제죠...^^;

============================
Stay Hungry, Stay Foolish

============================
Stay Hungry, Stay Foolish

klutzy의 이미지

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

ymir의 이미지

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 』

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.