[완료]malloc에 대해서.

puresupe의 이미지

1 #include
2 #include
3
4
5 typedef struct {
6 int a;
7 int b;
8 int c;
9 int d;
10 }*keke;
11
12
13 keke ptr;
14 int main(void)
15 {
16 ptr = (keke)malloc(sizeof(int));
17 printf("%d\n",sizeof(*ptr));
18 return 0;
19 }

결과는 16이 나오구요.

여기서처럼 비록 4바이트만 memory allocation을 해도. 16바이트가 할당되는게 궁금해서요 ㅋ

컴파일러가 알아서 수정해서 컴파일하는걸까요?

bushi의 이미지

무슨 소린지...

int main()
{
  printf("%d\n", sizeof(char *));
}

가 어떤 결과를 보이길 기대하시는 건가요 ?

OTL

bootmeta의 이미지

32bit머신의 경우 ptr이 가르키는 것은 4바이트 int로 잡은 malloc 영역 선두를 가르키는 것은 맞습니다.
그러나 sizeof( *ptr)을 사용해 실제 영역을 참조하려는 순간 malloc으로 잡은 4바이트 영역 넘어 16바이트 크기만큼 참조합니다.
결국 이런 코드는 실제 malloc으로 할당받은 영역을 참조하는 것이 아니라, 다른 메모리 영역을 침범하는 것일 뿐입니다.

simpid의 이미지

일단 소스코드에 대한 설명은 윗분들이 해주셨고...

malloc() 에 대해 말씀드리면...

메모리 관리는 OS에서 담당합니다.
문제는 메모리 할당을 위해서 시스템 콜을 하면 성능이 떨어집니다.
그래서 malloc의 경우 사용자 요청이 있을때 OS에 요청(시스템콜)해서 큰 덩어리 하나를 할당 받아놓고
요청있을때 마다 큰 덩어리를 쪼개서 사용자에게 전달합니다.

큰덩어리를 어떻게 쪼개서 사용중이고 얼마나 남아있는지 관리를 해야 하므로
요청한 메모리 보다 많은 영역이 할당되게 됩니다.

malloc의 경우 다음 공간 위치와 현재 공간의 크기를 포함하기 때문에 4바이트 요청시 12바이트가 할당되는걸로 기억합니다.
(정확히 12바이트인지는 기억 안나지만 대충 비슷할껍니다.)

doraq의 이미지

>> 여기서처럼 비록 4바이트만 memory allocation을 해도. 16바이트가 할당되는게 궁금해서요 ㅋ

위 말에 따르면 sizeof( x ) 하면 x address에 할당된(malloc) 메모리의 크기가 나오는거라고 알고
계신듯 하네요.

4 바이트만 할당된게 맞습니다.
단지 sizeof(*ptr) 했기 때문에 ptr의 을 참조 했고 ptr은 keke라는 구조체기 때문에 구조체의 전체 크기
인 16 바이트를 리턴한겁니다.

sizeof 로는 동적으로 할당한 메모리의 크기를 알 순 없습니다.

물론 다른 방법으로도 주소만 가지곤 할당한 양을 알순없지만요.

puresupe의 이미지

아. 제대로 알았네요 ㅋ

리플달아주신분들 모두 답변감사드려요 ㅜ_ㅜ
열심히공부할꼐요 .덜덜덜..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.