malloc()등으로 설정한 동적메모리공간의 크기를 알수 있나요?

realian의 이미지

자신이 직접 malloc()을 이용해서 메모리 공간을 할당한다면 모르지만
어떤 메서드나 기타 등등의 결과로 동적 메모리 공간의 주소를 받아오게 될때

결국 자신이 가진 정보는 이 메모리 공간의 시작번지를 가리키는 포인터 변수밖에 없는데
이걸 이용해서 할당된 메모리 공간의 크기를 알 수 있나요?

그냥 포인터 변수에 대고 sizeof() 하니 포인터 변수의 크기인 4가 나오더군요

알 수 없는건가 보다.. 라고 생각했는데
생각해 보니 free()를 통해 해제할때도 크기를 알아야 해제하겠죠?
그럼 어딘가 할당된 크기에 관한 정보가 존재할 거 같은데
이런 정보가 저장되어 있는지, 포인터 변수만 갖고 있어도 이 정보를 사용할 수 있는지

궁금합니다...

Renn의 이미지

malloc()으로 할당한 메모리를 가리키는 포인터를 sizeof로 알아봤자 포인터변수의 사이즈 밖에는 알아낼 수 없겠죠. 아무래도 커널에서 할당된 메모리에 대해서 관리를 할테고 그러니깐 free() 시에도 할당된 만큼 다시 반환되겠죠.

특별히 할당된 양을 알 수 있는 방법은 없는 것 같습니다. 대신 malloc() 이용해서 함수 하나 만들면 간단히 구현되지 않을까요? 그냥 변수 하나에 할당된 만큼씩 더해가고, free() 시에는 빼도록... (앗... 사이즈 테이블 같은 것도 필요하겠군요. -_-;;)

shean0의 이미지

http://kldp.org/script/bbs/read.php?table=qa2&no=3058&o[sc]=c&o[ss]=%B8%DE%B8%F0%B8%AE%20%B4%A9%BC%F6&o[st]=a&o[at]=s&o[sct]=s&o[stt]=s

하고.

http://bbs.kldp.org/viewtopic.php?p=636#636

여기요~

다음에는 제가 직접 답을 줄수 있는 "고수"가 되어야쥐^^*

언제나 즐프를 꿈꾸며~

realian의 이미지

음.. 역시 결론은 프로그래밍 수준에서는 알아낼 수 없다.. 인것 같군요..
이 문제를 생각하게 된 이유는 왜 atoi는 있는데 itoa는 없을까.. 라는 생각에서였구요..
itoa를 만들었는데 이걸 쓰는 메인함수에서 free()를 해줘야 된다는 걸 보고 그랬습니다...

하이레느님 답변보고..잠시 잊었던 리눅스의 정신이 생각났습니다.
"필요하면 구하라. 없다면 당신이 만들어라"
감사합니다.
(참 프로필의 그림은 혹시 "하레와 구우"의 하레 인가요? 아 추억의 만화 ㅠ.ㅠ)

..........No Sig.........|
-------------------+

익명 사용자의 이미지

Quote:
이 문제를 생각하게 된 이유는 왜 atoi는 있는데 itoa는 없을까.. 라는 생각에서였구요..
itoa를 만들었는데 이걸 쓰는 메인함수에서 free()를 해줘야 된다는 걸 보고 그랬습니다...

itoa 는 sprintf 로 구현할 수 있습니다. :)

malloc 내부적으로는 [malloc관리 데이터][사용자 데이터] 의 링크드 리스트로 관리한다고 알고 있습니다. (그래야 free로 제대로 해제할 수 있겠죠?)
자세한 내용은 libc 소스코드를 보시는게 좋겠군요. libc가 부담스러우시다면 기존 dos용 런타임 라이브러리 소스도 괜찮을듯. (bc 3.1 에도 있고, VC에서도 제공되는 것으로 기억합니다.)
사용자 레벨에서 저 관리데이터를 직접 억세스 하는 펑션은 제공되지 않습니다. 굳이 사용자가 내부 구조를 알 필요도 없고 실수로라도 조작하면 메모리가 깨지니까요.

shean0의 이미지

그냥 허접하게 이렇게 하면 되지 않나요?
/256 보다는 >>8이 더 낳을거구...

unsigned int my_itoa(unsigned int source,unsigned char * target,int rax)
{
     printf("source[%d]\n",source);
     target[0]=(unsigned char)(source/256/256/256);
     target[1]=(unsigned char)( source/256/256);
     target[2]=(unsigned char)(source/256);
     target[3]=(unsigned char)(source%256);
     printf("\n my_itoa[%x][%x][%x][%x]",target[0],target[1],target[2],target[3]);
     return TRUE;
}

혹시 sprintf로 구현이=
sprintf((unsigned char)tmp_buf,"%d",int_example);
이렇게 하는 것 말씀하신것인가요??

음..이래두 되겠군.....

언제나 즐프를 꿈꾸며~

cdpark의 이미지

돌려준 포인터가 malloc()의 결과일 수도 있지만, new의 결과일 수도 있고, 내부 static buffer일 수도 있고, 혹은 malloc으로 왕창 잡은 메모리의 일부일 수도 있습니다. 함부로 free하면 큰일나죠. :(

포인터를 돌려주는 함수의 man page를 보면 돌려준 포인터를 어떻게 처리해야 하는지 나와 있습니다.

댓글 달기

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