malloc의 size 구하기.

whatisid의 이미지

int main()
{
    char *str;

    str = (char *)malloc(100);
    memcpy(str,"1234567890",10);

    printf("%d %d %d\n",strlen(str),sizeof(str),sizeof(*str));

}

결과 :

10 4 1

malloc 사이즈인 100이 나오게 할 방법은 없는 것일까요?

(str에 담길 내용은 binary 값이 될수도 있어서 strlen은 좋은 방법이

아닐 것 같습니다.)

서지훈의 이미지

char *str; 

    str = (char *)malloc(100);

이 코드를
char str[100];
이렇게 변경해 주면 고민은 해결이 될거 같네요...
요즘 메모리값 똥값인데...
몇 바이트 아낄려고 용써봐야...
누가 알아봐 주는 사람 없죠...
근데... 임베딩 프로그램이나 따른 optimization 이 필요한 경우라면...
struct {} 구조로 구성을 하셔야 할듯...-_-ㅋ
아님 앞에 헤드 부분을 주덩가...
그렇지 않고선 -_-ㅋ
아주 힘든 꽁수가 필요하지 않나 생각이 드네요...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

winner의 이미지

han.comp.lang.c 에서 알려고 하면 다친다는(-_-) 답변이 기억나네요.

크기를 기억하는 변수를 만들라는 것에 한표!

whatisid의 이미지

문제는 malloc(100) 의 100이 가변적이라는 겁니다.

좀더 상황을 쓰면, malloc(n) 으로 queue를 쭉 생성하는 건데요. 그렇다면

결국 queue에서 할당 사이즈인 n까지 넣어서 관리해야 하는 것일까요;;;

choissi의 이미지

whatisid wrote:
문제는 malloc(100) 의 100이 가변적이라는 겁니다.

좀더 상황을 쓰면, malloc(n) 으로 queue를 쭉 생성하는 건데요. 그렇다면

결국 queue에서 할당 사이즈인 n까지 넣어서 관리해야 하는 것일까요;;;

사이즈 + malloc 데이터..
이런식으로 구현해주는게 좋을꺼 같네요

울랄라~ 호기심 천국~!!
http://www.ezdoum.com

서지훈의 이미지

whatisid wrote:
문제는 malloc(100) 의 100이 가변적이라는 겁니다.

좀더 상황을 쓰면, malloc(n) 으로 queue를 쭉 생성하는 건데요. 그렇다면

결국 queue에서 할당 사이즈인 n까지 넣어서 관리해야 하는 것일까요;;;


그럼... str이 queue 란 말씀 이신가요(어떻게 구현을 하실려는 건지...)?
만약 이게 queue 이더라도...
가변 길이를 알 수 있는 방법은 없습니다.
얼마만큼의 데이터가 들어가 있는지...
어딘가 기록을 해야만 합니다.
그래야 알 수가 있습니다.
그러니 struct로 data, size 이 두개의 요소로 구현을 하셔야 할듯 하네요.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

Jun92의 이미지

winner wrote:
han.comp.lang.c 에서 알려고 하면 다친다는(-_-) 답변이 기억나네요.

크기를 기억하는 변수를 만들라는 것에 한표!

str가 가르키는 메모리의 앞부분에 malloc한 싸이즈가 저장된다고 알고
있습니다만... 얼마나 앞에 있는지가 잘 기억이 나지 않는군요.

알면 다친다는 표현이 딱 맞는것이.. 이 값을 알아낼려고 앞부분으로 포인터
를 이동했다간 무슨 일이 벌어질지 예상을 못하기때문일듯합니다.

크기를 기억하는 변수를 만들라는것에 제 한표도 던지겠습니다. ^^

=============================
야후!

ux의 이미지

얼마전에 읽은 "버그 안녕(Writing Solid Code)" 책에 보면

malloc으로 할당한 메모리의 크기를

알기 위해서는 따로 관리를 해 주어야 하는 듯 합니다.

(ANSI C 표준에 없다면, compiler나 OS에 따라서 언제나 변경될 수 있는
상황이라서 -_-, 표준에 없으니 저 책에서 따로 관리를 해 주었겠죠...^^;;;)

@UX... Vnn~

kuma의 이미지

Visual C/C++ 6.0 에서는 이렇게 되는군요.
#include <malloc.h>
#include <memory.h>
#include <stdio.h>
int main( )
{
char * p = (char*)malloc( 15 );
printf( "Size p = %d\n", *(int*)(p-16) );
return 1;
}

akbar의 이미지

...

kuma의 이미지

gcc ver 3.2.2 이고 Red Hat 3.2.2-5에서는....
#include <malloc.h>
#include <stdio.h>
int main( )
{
char * p = (char*)malloc( 15 );
printf( "%d\n", *(int*)(p-4) );
return 1;
}

pynoos의 이미지

제 글이라 인용안하고 싶었는데.. 혹 참고 되실 것 같아서..

http://bbs.kldp.org/viewtopic.php?t=1244

댓글 달기

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