何はmalloc(0)プロジェクトとは?[重複]
質問
この質問に答えはこちら
- その点ではmalloc(0)? 17回答
ものは何か malloc(0)
も進めていきます。うに回答すると同じ realloc(malloc(0),0)
?
#include<stdio.h>
#include<malloc.h>
int main()
{
printf("%p\n", malloc(0));
printf("%p\n", realloc(malloc(0), 0));
return 0;
}
出力からlinux gcc:
manav@manav-workstation:~$ gcc -Wall mal.c
manav@manav-workstation:~$ ./a.out
0x9363008
(nil)
manav@manav-workstation:~$
出力変化していく傍のための malloc(0)
.この標準の答えはどうでしょうか?やってるとなんかに興味を持ってなポインター以外の学術研究から生まれたのでしょうか?
編集:
の場合 malloc(0)
返ダミーのポインタ、方法は以下の作品
int main()
{
void *ptr = malloc(0);
printf("%p\n", realloc(ptr, 1024));
return 0;
}
編集:
次のコードの出力を"可"に毎になります。かな?
#include<stdio.h>
#include<malloc.h>
int main()
{
int i;
void *ptr;
printf("Testing using BRUTE FORCE\n");
for (i=0; i<65000; i++)
{
ptr = malloc(0);
if (ptr == realloc(ptr, 1024))
printf("Iteration %d: possible\n", i);
else
{
printf("Failed for iteration %d\n", i);
break;
}
}
return 0;
}
解決
その他の回答方法 malloc(0)
ます。そんなお客様の声にお答え致しのいだからとれていない答えられているので、その先からます。のについて realloc(malloc(0), 0)
:
ものは何か
malloc(0)
プロジェクトとは?うに回答すると同じrealloc(malloc(0),0)
?
標準はこの約 realloc(ptr, size)
:
- の場合
ptr
はNULL
, でのように動作すmalloc(size)
, - その他(
ptr
ではないNULL
でdeallocatesの古いオブジェクトへのポインタによるptr
を返すポインタを新たに割り当てバッファです。がの場合size
0C89のような効果は相当free(ptr)
.興味深いことになアライメントが可能で、大きなことを書C99案(n1256はn1336).にC89、良識ある値を返す場合がNULL
.
である場合
malloc(0)
を返しますNULL
に実装されます。そしておrealloc()
電話相当realloc(NULL, 0)
.ることに相当malloc(0)
上から、それはNULL
この場合).malloc(0)
返非NULL
.その後、呼び出しは相当free(malloc(0))
.この場合、malloc(0)
やrealloc(malloc(0), 0)
は ない 等価です。
場合がありますので注意して興味深い場合はこちら:第二の場合 malloc(0)
返非NULL
成功するとは残るものの返却 NULL
を表示します。この話のように: realloc(NULL, 0)
, する相当の malloc(0)
, る場合には返されない場合があり NULL
.
私はしてお使いいただく場合には、漏C99は監督だからというのはいかかでしょうかC99, realloc(ptr, 0)
のための非NULL
ptr
と等価ではありません free(ptr)
.ったこと gcc -std=c99
, は、上記と同等の free(ptr)
.
編集:いいと思うかの混乱は:
振り返ってみたいと思いスニペットから例のコード:
ptr = malloc(0);
if (ptr == realloc(ptr, 1024))
上記と同じではない malloc(0) == realloc(malloc(0), 1024)
.また、第二には、 malloc()
呼び出しが行われたあとで回は初の、通過した割当ポインタ realloc()
.
だ分析のコードです。仮に malloc(0)
とならない NULL
に成功 ptr
有効な値です。だけど、 realloc(ptr, 1024)
, realloc()
基本的には、新しいバッファのサイズ1024、 ptr
無効になります。ョンの実装を返し同じアドレスとして、既存の ptr
.なので、お if
条件の場合にtrueを返します。(但し、価値の ptr
後 realloc(ptr, 1024)
が定義されません。)
そこで問題お願い: malloc(0) == realloc(malloc(0), 1024)
.この場合、その malloc(0)
の右と右軸を返します非NULL
.その後、保証されなければならないと思います。また、戻り値から malloc()
の右れていない free()
dただその他の malloc()
, calloc()
, や realloc()
返されない場合がありなければならないかを指します。このように書いた自分の状況として
if (malloc(0) == realloc(malloc(0), 1024)
puts("possible");
まい possible
出力(きしない malloc()
や realloc()
失敗し返し NULL
).
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
void *p1;
void *p2;
p1 = malloc(0);
p2 = realloc(p1, 1024);
if (p1 == p2)
puts("possible, OK");
/* Ignore the memory leaks */
if (malloc(0) == realloc(malloc(0), 1024))
puts("shouldn't happen, something is wrong");
return 0;
}
OS Xでは、自分のコードな出力が何を行ったのです。Linuxでの印刷 possible, OK
.
他のヒント
malloc(0)
あるはるかC99が懸念されるとの定義の実装ます。
からのC99する [セクション7.20.3
の順序とののcallocに連続呼び出しによって割り当てられた記憶の連続性、 malloc関数、およびreallocの機能がunspeci FiのED のです。ポインタが割り当てた場合に返されます それは、オブジェクトの任意の型へのポインタに割り当てることができるように、成功は、適切に位置合わせされます そしてそのようなオブジェクトまたは割り当てられた空間でこのようなオブジェクトの配列にアクセスするために使用 (スペースは、明示的に割り当てを解除されるまで)。割り当てられたオブジェクトの寿命が延びています 割り当てから解除まで。各そのような割り当てはへのポインタを得なければなりません 他のオブジェクトからオブジェクトばらばら。ポインタは先頭にポイントを戻した(最下位バイト 割り当てられた空間のアドレス)。スペースを割り当てることができない場合は、NULLポインタがあります 戻ってきた。要求されたスペースのサイズがゼロの場合のは、動作は実装にあります デFiのNED の:NULLポインタが返され、またはサイズがいくつかあったかのように振る舞いはどちらか 返されたポインタがオブジェクトにアクセスするために使用してはならないことを除いてゼロでない値、
ではC89、malloc関数(0)は実装依存である - C99はこれを固定したりしていない場合、私は知りません。 C ++では、使用します:
char * p = new char[0];
が明確に定義されている - あなたは、有効な、非NULLポインタを取得します。もちろん、あなたは未定義の動作を起動することなく、それが指すどのようなアクセスへのポインタを使用することはできません。
は、これが存在する理由としては、それはいくつかのアルゴリズムのために便利で、あなたがごみにゼロ値のテストであなたのコードを必要としません。
の手段C99の標準
スペースを割り当てることができない場合は、 nullpointerが返されます。サイズの場合 スペースの、ゼロである要求 動作は実装定義であります: ヌルポインタが返されるか、またはいずれか サイズであるかのように振る舞いです ことを除いて、いくつかのゼロ以外の値、 返されたポインタがに使用してはなりません オブジェクトにアクセスします。
comp.lang.cよくある質問を持ってい<のhref = "のhttp:/ /c-faq.com/ansi/malloc0.html」のrel = "noreferrer">次のが言ってます:
ANSI / ISO規格は、それがかもしれないと述べています いずれかを実行し;動作があります 実装定義は、(質問を見ます 11.33)。ポータブルのコードでは、どちらかのmalloc(0)を呼び出すしないように注意してください、またはなければなりません ヌルの可能性を準備 リターンます。
だから、それはmalloc(0)
を使用しないように、おそらく最善です。
を参照してくださいC99、セクション7.20.3ます:
宇宙の大きさが要求された場合には、 ゼロ、動作があります implementationdefined:どちらかはnull ポインタが返され、または行動れます サイズは、いくつかの非ゼロであるかのようです 値は、返されたことを除いて、 ポインタは、アクセスANに使用してはなりません 対象ます。
この3つのすべての割り当て関数(すなわちcalloc()
、malloc()
とrealloc()
)のために有効です。
は、長さが0でそのrealloc
がfree
と同じものです。
Solarisのマニュアルページから:
realloc()
関数は、尖ったブロックのサイズを変更しますptr
にsize
によって(おそらく移動)ブロックへのポインタをバイト返します。内容はそのままに、最大になります 新旧のサイズの小さい方。ptr
がNULL
であれば、realloc()
指定されたサイズのためmalloc()
のように動作します。size
は0
ある場合 そしてptr
がNULLポインタでない、スペースが作られているために指摘しました 、しかしアプリケーションによってさらに割り当て可能 システムに戻されません。メモリがシステムに返されます 唯一のアプリケーションの終了時にます。
1が、それは(私に起こった)悪い驚きの源であることを知らない場合ます。
私はそれが依存だと思います。 私は、Visual Studio 2005のソースをチェックし_heap_alloc機能でこれを見ます:
if (size == 0)
size = 1;
私は多くの場合、あなたはゼロバイトを求めた場合であっても、有効なポインタをすることができたと思います。 この動作の一貫性があるため、それが簡単にあなたのポインタをチェックすることができますので、これはです:あなたは非NULLポインタを持っている場合、それはOKです。あなたはNULLポインタを持っている場合は、おそらく問題を抱えています。 私はほとんどの実装は、ゼロバイトを求めた場合であっても、有効なポインタを返すことだと思う理由です。
場合はmalloc(0)を返しまダミーのポインタ、方法は以下の作品
void *ptr = malloc(0);
printf("%p\n", realloc(ptr, 1024));
どうなるかはわからないがんによる"ダミーのポインタ".の場合 malloc(0)
を返します非NULLの場合、 ptr
有効なポインタをメモリブロックのサイズをゼロになります。の malloc
実施に保存この情報は、実装固有のやり方です。 realloc
知の実装固有の)方法を図る ptr
ポイントメモリブロックのサイズをゼロになります。
(どのよう malloc
/realloc
/free
これは、実装固有のものです。一つの可能性を4バイト以上を要請し、店舗の直前のメモリブロックです。その場合、 ((int *)ptr)[-1]
により、メモリブロックサイズ 0
.るわけにはゆきませんいからのコードでのみ使用する realloc
や free
).