• 締切済み

malloc(0)でNULLが返された

malloc(0)でNULLが返されました。 これはエラーが起きたということですよね? buf=malloc(0);は普通は正常に処理されて正常なアドレスが返されるはずですよね? なぜNULLが返されたんでしょうか?

みんなの回答

  • hope10
  • ベストアンサー率48% (17/35)
回答No.5

質問内容が変遷しているようですね。 >malloc(0)がNULLを返すということが書かれているペー >ジをこ存じでしたら教えてください。 古株の方は良くご存知の LSI C-86 MAN に明記されていました。 以下抜粋: ----------------------------------------------- LSI C-86 Reference Manual MALLOC(3)  ...中略... size に0を指定するとfree(ptr)と同じ動作をし、 ptrが指す領域を開放したうえで値NULLを返します。 ----------------------------------------------- 確認したければダウンロードして下さい。

参考URL:
http://www.vector.co.jp/soft/maker/lsi/se001169.html
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

標準Cの規格書については、下記参考URLから「X3010」でJIS検索してください。 mallocに関しては、7.20.3および7.20.3.3を参照してください。 要求されたサイズが0の場合は処理系定義で、NULLを返すか0でないサイズを要求した場合の動作のいずれかであることが明記されています。

参考URL:
http://www.jisc.go.jp/
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2>malloc(0)がNULLを返すということが書かれているページをこ存じでしたら教えてください。 参考URLにもそう書かれていました。 規格書の中の参照ページも書かれています。 結局の処規格書を見ないといけないわけですが、 規格書は有料で配布されているものですので、ネット上でまんま載ってる所はないんじゃないかと思います。 規格書を手に入れるには、 は同じく参考URLの11.2に書かれています。

参考URL:
http://www.kouno.jp/home/c_faq/c11.html#26
  • jgk
  • ベストアンサー率75% (104/138)
回答No.2

malloc(0)は、NULLを返すか、同じように処理をしてポインタを返すのどちらかと仕様で決まっています。どちらを返すかは処理系依存です。

yuyata
質問者

補足

ありがとうございます。 malloc(0)がNULLを返すということが書かれているページをこ存じでしたら教えてください。

回答No.1

0バイトのメモリを確保・・・メモリを確保していない。 だから、NULLなのでは? 仮に、どこかのアドレスが返ってきても、そのアドレスには書き込めないのだから。(∵0バイトしかメモリを確保していない)

関連するQ&A

  • mallocについて

    まだ初心者で分からないところがあるのですが 例えば char *Buf; Buf=(char *)malloc(256); free(Buf); としますよね? それを、 グローバル変数(?)で「char *Buf」として 処理の途中途中で Buf=(char *)malloc(*適当) を、何回も使い 最後の解放されるときに free(Buf) (*適当 は、適当な数値) を使う事は大丈夫でしょうか? それとも、ちゃんとメモリを割り当て(?)たら 使ったあとすぐに、メモリを解除しなければ ならないのですか? よろしくお願いしますm(_ _)m

  • mallocのプログラム

    以下の問いの回答を教えてください。 1.malloc関数を用いて巨大な配列を確保して、 その配列に書き込みを行うようなプログラムを作成しなさい。 int *buf; buf = (int*)malloc(SZ*sizeof(int)); if (buf == NULL) { perror("malloc"); exit(1); } for (i = 0; i < SZ; i++) buf[i] = i; 2.プログラムで、配列のサイズをさまざまに変えた時、 major pagefault と minor pagefault の回数がどうなるか調べなさい。 2. で調べた最大サイズの他、3~4通りのサイズで試すこと。 困ってますよろしくお願いします。

  • mallocとfree

    struct list *p; /* 記憶領域の確保 */ if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) { printf("malloc error\n"); exit(1); } とサンプルプログラムがあるのですが、if分の意味がわかりません。 また、mallocを使った場合freeで開放とあるのですが、 どういう意味なのかわかりません。 よろしければ、上記2つの点について教えてください。

  • 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

  • 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 というエラーがでます。

  • mallocについて

    vine linux 3.0上でgccを使い下記のようなプログラム(読みにくいプログラムで申し訳ありません)を作成してみました。無事コンパイルも通りメモリも確保出来ました。 しかし、このプログラムを2つ起動しそれぞれでメモリを確保するとおかしな事が起きるのです。どういう症状かと言うとプログラム1もプログラム2も同じ先頭アドレスを確保しているのです。 例) プログラム1 keep memory size : 11 address : 0x8049700 プログラム2 keep memory size : 11 address : 0x8049700 なぜこのような事が起こるのでしょうか? ご教授宜しくお願いします。 #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { int size; unsigned int *p; char buf; size = atoi(argv[1]); printf("keep memory size : %d\n", size); p = (unsigned int *)malloc(size); printf("address : %p\n", p); scanf("%c", &buf); free(p); }

  • アーキテクチャの設問

    以下の問いの回答を教えてください。 1.malloc関数を用いて巨大な配列を確保して、 その配列に書き込みを行うようなプログラムを作成しなさい。 int *buf; buf = (int*)malloc(SZ*sizeof(int)); if (buf == NULL) { perror("malloc"); exit(1); } for (i = 0; i < SZ; i++) buf[i] = i; 困ってますよろしくお願いします。

  • strncpyと_tcsncpy_sのヌルの扱いが違う点

    strncpyの場合は、\0を付加しないのですが、_tcsncpy_sは ヌルを付加しますが、これは仕様でしょうか? 同じ意味の関数なのにヌルの振る舞いが異なると勘違いします。 TCHAR型を扱う関数で、strncpyと同じようにnullを付加しない関数はあるのでしょうか? このあたりについて詳しく書かれている本も探しております。 strcpy(buf1, "aaaaa"); strncpy(buf1, "b", 1); 結果 buf[0] = "b" buf[1] = "a" buf[2] = "a" buf[3] = "a" buf[4] = \0 _tcscpy_s(buf1, sizeof(buf1), "aaaaa"); _tcsncpy_s(buf1, sizeof(buf1), "b", 1); 結果 buf[0] = "b" buf[1] = \0 buf[2] = "a" buf[3] = "a" buf[4] = \0

  • アーキテクチャの課題

    以下の問いの回答を教えてください。 1.malloc関数を用いて巨大な配列を確保して、 その配列に書き込みを行うようなプログラムを作成しなさい。 int *buf; buf = (int*)malloc(SZ*sizeof(int)); if (buf == NULL) { perror("malloc"); exit(1); } for (i = 0; i < SZ; i++) buf[i] = i; 課題では以上のヒントが与えられています。 サイズは1Gぐらいで何もわからないのでプログラムの全文を教えていただきたいです。 困ってますよろしくお願いします。

  • malloc.cを見たい

    TurboLinux10でとあるプログラムを実行していましたが、 coreファイルを吐き出してGUIが終了してしまうことがあります。  gdb -c core.**** 実行ファイル名 というコマンドでGUIが終了した原因を調べたところ、  kernel/malloc.c:3415  kernel/malloc.c そのようなファイルやディレクトリは見つかりません。 と出ていました。 malloc.cというソースファイルを見たいのですが、 どこから入手すればよいでしょうか。 TurboLinux10は「全パッケージ」を選択してインストールしており、 カーネル再構築もできるのでカーネルのソースファイルは入っているはずですが、 最低3415行もあるmalloc.cは存在しません(十数行の同名ファイルはありました)。 TurboLinux10DesktopのソースファイルをFTPサーバーからダウンロードしようと、 ftp://ftp.turbolinux.co.jp/pub/TurboLinux/TurboLinux/ia32/Desktop/10/source/SRPMS/ に行ってみたのですが、 勿論malloc.cが入っていそうなパッケージがわかりません。 (そもそも、「malloc.cが見つからない」と出た場合にmalloc.cを入手してくるべきなのでしょうか)

専門家に質問してみよう