- 締切済み
malloc(0)でNULLが返された
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- hope10
- ベストアンサー率48% (17/35)
質問内容が変遷しているようですね。 >malloc(0)がNULLを返すということが書かれているペー >ジをこ存じでしたら教えてください。 古株の方は良くご存知の LSI C-86 MAN に明記されていました。 以下抜粋: ----------------------------------------------- LSI C-86 Reference Manual MALLOC(3) ...中略... size に0を指定するとfree(ptr)と同じ動作をし、 ptrが指す領域を開放したうえで値NULLを返します。 ----------------------------------------------- 確認したければダウンロードして下さい。
- jacta
- ベストアンサー率26% (845/3158)
標準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)
#2>malloc(0)がNULLを返すということが書かれているページをこ存じでしたら教えてください。 参考URLにもそう書かれていました。 規格書の中の参照ページも書かれています。 結局の処規格書を見ないといけないわけですが、 規格書は有料で配布されているものですので、ネット上でまんま載ってる所はないんじゃないかと思います。 規格書を手に入れるには、 は同じく参考URLの11.2に書かれています。
- jgk
- ベストアンサー率75% (104/138)
malloc(0)は、NULLを返すか、同じように処理をしてポインタを返すのどちらかと仕様で決まっています。どちらを返すかは処理系依存です。
- bloomers_daisuki
- ベストアンサー率14% (40/267)
0バイトのメモリを確保・・・メモリを確保していない。 だから、NULLなのでは? 仮に、どこかのアドレスが返ってきても、そのアドレスには書き込めないのだから。(∵0バイトしかメモリを確保していない)
関連するQ&A
- mallocについて
まだ初心者で分からないところがあるのですが 例えば char *Buf; Buf=(char *)malloc(256); free(Buf); としますよね? それを、 グローバル変数(?)で「char *Buf」として 処理の途中途中で Buf=(char *)malloc(*適当) を、何回も使い 最後の解放されるときに free(Buf) (*適当 は、適当な数値) を使う事は大丈夫でしょうか? それとも、ちゃんとメモリを割り当て(?)たら 使ったあとすぐに、メモリを解除しなければ ならないのですか? よろしくお願いしますm(_ _)m
- ベストアンサー
- C・C++・C#
- 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通りのサイズで試すこと。 困ってますよろしくお願いします。
- 締切済み
- C・C++・C#
- mallocとfree
struct list *p; /* 記憶領域の確保 */ if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) { printf("malloc error\n"); exit(1); } とサンプルプログラムがあるのですが、if分の意味がわかりません。 また、mallocを使った場合freeで開放とあるのですが、 どういう意味なのかわかりません。 よろしければ、上記2つの点について教えてください。
- ベストアンサー
- C・C++・C#
- 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・C++・C#
- 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・C++・C#
- 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); }
- ベストアンサー
- C・C++・C#
- アーキテクチャの設問
以下の問いの回答を教えてください。 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; 困ってますよろしくお願いします。
- 締切済み
- C・C++・C#
- 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
- ベストアンサー
- C・C++・C#
- アーキテクチャの課題
以下の問いの回答を教えてください。 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ぐらいで何もわからないのでプログラムの全文を教えていただきたいです。 困ってますよろしくお願いします。
- 締切済み
- C・C++・C#
- 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を入手してくるべきなのでしょうか)
- ベストアンサー
- Linux系OS
補足
ありがとうございます。 malloc(0)がNULLを返すということが書かれているページをこ存じでしたら教えてください。