• 締切済み

C言語 mallocによる消費メモリ

char *b = (char *)malloc(sizeof(char) * 6) というC言語のプログラムで、消費されるメモリは何バイトになるのでしょうか?理由も合わせて教えていただきたいです。 32ビットのPCで行うものとしてよろしくお願いいたします。

みんなの回答

  • chie65535
  • ベストアンサー率43% (8525/19378)
回答No.5

>消費されるメモリは何バイトになるのでしょうか? 32ビット系のシステムなら、最低でも20バイトか24バイト。 >理由も合わせて教えていただきたいです。 ヒープ領域で確保されたメモリブロックは「16バイトの、ブロック管理用のデータ」と「確保したサイズのメモリ」と「4バイト境界に整列させる為の調整領域」で構成されます。 ある処理系では、6バイト分が確保されたメモリのポインタの前後を見ると このブロックの前のブロックのアドレス4バイト このブロックの次のブロックのアドレス4バイト このブロックで確保されたメモリのサイズ4バイト このヒープメモリの先頭ブロックのアドレス4バイト 確保されたメモリ6バイト  ←この6バイトの先頭がmallocで返って来るポインタ 次が4バイト境界になるための調整領域2バイト という感じで、24バイト使われます。 上記の場合「4バイトの管理用データが4つある」ので、合計24バイトになりますが「4バイトの管理用データが3つある」と言う処理系や「4バイトの管理用データが5つある」と言う処理系も存在します。 つまり「何バイト使われるかは、処理系に依存するので、判らない」が答え。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.4

#3です。 とりあえず書いておきますが、sizeof 演算子を使ってmallocが実際に確保しているメモリサイズを取得することはできません。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.3

malloc系の実装により異なります。

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

消費メモリということなら、malloc() の管理用の領域や切りのいい数値への切り上げ等あるので、最低6バイト以上で実装によって違うんじゃないですかね。フリーな実装なら malloc() 周辺のコードを漁れば大体予想付くでしょうけど、その時々でも変化するので厳密に制御したいなら自作するしか無いでしょう。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

charは普通1バイトなので6バイトですね。 ただ、処理系(OSやコンパイラ)によっては違うこともありますので、 sizeofを使って表示させてみてください。

関連するQ&A

  • ヘッダファイル? malloc.hとかは自分で足したり作ったりできるのでしょうか

    CmachineでC言語を勉強していて、メモリの確保までたどり着きました。 でも、プログラムを実行できないんです。調べたところ、malloc.hやmemory.hがCmachineのincludeフォルダに入っていませんでした。 char *b; b = (char *)malloc(sizeof(char)*200); とか書いても実行できませんよね・・・。Cmachineは勉強するのに便利だし、ヘッダファイルを追加できないのでしょうか。includeフォルダにテキストファイルで書いて入れればできそうなのですが。 ちなみに、Visual C++ Express Editionでも同じプログラムを実行したのですが、できませんでした。あれもヘッダファイルが無いとかの問題なのでしょうか。あれは操作が複雑で難しくてよくわかりません。 アドバイスやいい方法をご存知の方、教えてください!!

  • セグメンテーション違反とmalloc

    char *name この宣言でプログラムの組初めはこれでいけたのですが char *name = (char *)malloc(sizeof(char) * 10); 後からこのようにmallocで動的メモリ確保しないとセグメンテーション違反が起きるようになりました。 なぜこうなるのでしょうか? それとmallocの使うタイミング(どういう時)に使えばよいのでしょうか?

  • malloc使用後のメモリアロケーションエラー(MS-C7.0)

    初めて投稿させていただきます。 現在PC:98 OS:MS-DOS 言語:MS-C7.0のhugeモデル という環境で プログラミングを行っております。しかし、config.sys,autoexec.batを 工夫してもメモリ不足を補えず、変数と動的にすることにしました。 c言語のテキストを参考に kansu() { char *p; p=(char *)malloc(256*256*sizeof(char)); if(p=null) printf("メモリ確保に失敗"); ・ ・ free(p); } とすると kansu終了直後に"メモリアロケーションエラー"がでます。 自分ではどこが悪いのわからず、ここでお聞きすることにしました。 上記の中の原因、もしくは原因と考えられることを教えてください。 よろしくおねがいします。

  • mallocについて

    mallocについて 現在C言語でプログラムをかいているのですが、原因不明のエラーが出て困っています。 それはmallocによる動的メモリ確保を行ったとき、 (float *)malloc(sizeof(float)*200)の場合大丈夫ですが、 (float *)malloc(sizeof(float)*320)ではエラーが出てしまうのです。 しかし (float **)malloc(sizeof(float*)*640)とした場合エラーは出ませんでした。 これは何が原因でエラーが出ているのでしょうか? ちなみにコンパイルはできており、実行したとき プログラム名(7637) malloc: *** error for object 0x100ff7a08: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug というエラーがでます。

  • C言語 動的なメモリの確保 実行できない

    malloc関数を使いメモリを確保しそこへ"ABCD"と記憶させ、ポインタ*Cを使い確保したメモリの内容を表示するプログラムです。 ********************************************* #include <stdio.h> #include <stdlib.h> int main(void) {   int i;   char *C;   C = (char *) malloc (sizeof(char) * 5);   C = "ABCD";   for(i = 0; i < 5; i++){     if(C[i] != NULL){       printf("%s", C[i]);    ←※エラー※     }   }   free(C);   return 0; } ********************************************* 正常にコンパイルできますが実行エラーになります。VCを使いF10のデバッグテストで※のところエラーになります。なぜなのでしょうか?

  • C/C++言語のメモリについて

    C言語でメモリを2種類?に分けると、スタックとヒープがあります。 ヒープは mallocなどで確保し、freeで解放しますがスタックは解放する必要がありません。 そのスタックは通常、何バイトまで可能なのでしょうか? あと関数外のファイルの先頭に int[1000000];とした場合、このメモリはmallocで確保していませんが、 どこに作られるのでしょうか? 私のパソコンはメモリが2GBでWindows2000ですが、CやC++で最大、何バイトまでメモリが使えますか? また、一番多くメモリを確保できるなら、OSはなんでも構いません。 解釈等も間違っていたらご指摘していただきたいです。

  • new と malloc によるメモリの動的確保について

    初めて投稿させて頂きます。よろしくお願い致します。 現在、以下のような、2次元配列による動的なメモリの確保を意図して、コードをC/C++にて記述しています。 (コンパイラはMINGW32のg++ 3.4.5) //mallocによるメモリ動的確保 data = (char **)malloc(num * sizeof(char*)); for(i=0; i<rowNum; i++){ data[i] = (char *)malloc(sizeof(char)*256); } //newによるメモリ動的確保 data = new char*[rowNum]; for(i=0; i<rowNum; i++){ data[i] = new char; } C++で書くのならば、 「mallocによるメモリ確保は辞め、newによるメモリ確保をしなさい」 という指摘が、書籍でもwebでもありましたので、 両方書き、両者を比べているのですが、理由がイマイチ分かりません。 10万行ほどのテキストデータで実験させてみたのですが、 mallocによる記述の方が、動作が数秒速いようなのです。 それで、new やmalloc で実際何をやっているのか、コードを見ようと思ったのですが、 newでは、 void* operator new(std::size_t) throw (std::bad_alloc); void* operator new[](std::size_t) throw (std::bad_alloc); void* operator new(std::size_t, const std::nothrow_t&) throw(); void* operator new[](std::size_t, const std::nothrow_t&) throw(); inline void* operator new(std::size_t, void* __p) throw() { return __p; } inline void* operator new[](std::size_t, void* __p) throw() { return __p; } というnewファイルの記述で行き詰まり、 malloc は malloc_allocator.hというファイルで行き詰りました。 以上を踏まえて、 1)そもそも、上記のメモリ動的確保記述はスマートな書き方なのか 2)実際に、newやmallocは、どういった手法でメモリ領域を確保しているのか 以上の2点について、ご教授下さい。よろしくお願い致します。

  • プロンプト入力 malloc( )

    #include <iostream.h> void f(char* str); main(){ char s[8] = "\0"; cout << "文字を入力" << '\n'; fgets(s, 8, stdin); f(s); } void f(char* str){ char* c; c = (char*)malloc(sizeof(char) * strlen(str)+1); cout << strlen(str) << '\n'; cout << sizeof(c); free(c); } - 結果 - 文字を入力 ( a、Ctrl+Z ) a 1 4 でした。 cout << sizeof(c); の結果は4でした。1バイトの入力だから\0を含めて 2バイトを確保したかった。 そのためにはどうしたらいいんですか? どうして4だったんですか? 文字を入力するとこで、Ctrl+Z の代わりに Enter を押すと Enter まで s に格納されてしまう。 cin を使うと8バイト以上の入力でも s に格納されてしまう。 そうならないためのよい方法があったら教えてください。

  • mallocについて

    mallocで得るアドレスの使い方が分からなくて困っています。 void main(){     char *mem;     char *initial_address; /*初期アドレス保持*/     mem = (char*)malloc(5);     printf("malloc mem -> %p\n", mem);     initial_address = mem;     mem = "abcd";     printf("%c - %p\n", *mem, mem);     printf("%c - %p\n", *initial_address, initial_address); } なぜかmem = "abcd";を実行するとmemのアドレスが変わってしまいます。 mallocで得た5byteはmem = "abcd";実行後のアドレスから5byteということでしょうか。。 それとmem = 'a';を実行するとmemのアドレスはなぜか変わりません。 どうか、ご教授よろしくお願いします。m(__)m

  • C言語 mallocとfreeについて

    mallocとfreeを何度も繰り返していると、メモリがどんどん増えていき、最終的にはプログラムが止まってしまいます。 いくつかのページでメモリ確保を繰り返すとメモリをかなり食ってしまうと書いてありました。 これに対する解決策をご存知の方いらっしゃいましたら教えてください。 よろしくお願いします。