21

calloc(1, sizeof(MyStruct))ずっと書くのはとても面倒です。このメソッドをラップするなどのアイデアは使いたくありません。つまり、2 つのパラメーターがどのようなものかを知りたいということですか? それが何かを与えるなら、なぜmalloc2つのパラメータも持たないのですか?

ところで、この質問に対する答えを探しましたが、本当に良い答えが見つかりませんでした。それらの答えは、callocより大きなブロックを割り当てることがmallocできるなどでした。

calloc配列を割り当てる別の回答を見ました。を使用mallocすると、乗算でき、配列を取得できます。最初はなくても使用できます1,

4

5 に答える 5

28

歴史的な理由。

callocが導入された時点では、malloc関数は存在せず、関数はcalloc1 つの要素オブジェクトに対して正しい位置合わせを提供していました。

が後で導入されたときmalloc、返されるメモリはどのような用途にも適切に配置される (より多くのメモリを消費する) と判断されたため、必要なパラメータは 1 つだけでした。の APIcallocは変更されていませんがcalloc、どのような用途にも適切に配置されたメモリを返すようになりました。

編集:

コメントの議論と@JimBalterからの興味深い入力を参照してください。

mallocandの導入に関する私の最初の発言は、calloc完全に間違っている可能性があります。

また、本当の理由は、アライメントとはまったく関係がない場合もあります。C の歴史は、コンパイラの実装者によって大きく変更されてきました。mallocさまざまなグループ/コンパイラの実装者から来る可能性がありcalloc、これによりAPIの違いが説明されます。そして、私は実際にこの説明を本当の理由として支持しています。

于 2012-09-23T20:30:09.103 に答える
4

私が思いつくことができた唯一の理由はそれです

int *foo = calloc(42, sizeof *foo);

は1文字短い

int *foo = malloc(42 * sizeof *foo);

本当の理由は明らかに失われていますミレニアム 何世紀もCの数十年の歴史があり、発掘するにはプログラミング言語の考古学者が必要ですが、次の事実に関連している可能性があります。

malloc()フルブロックサイズに従って整列されたメモリブロックを返す必要がある-とは対照的にcalloc()、意図したとおりに使用する場合、メモリブロックは2番目の引数として渡されたサイズに従って整列する必要があるだけです。ただし、C標準では、実装に準拠する際にこの最適化を禁止しています。

于 2012-09-23T21:58:38.243 に答える
0

callocNumber of elements (最初のパラメーター) x 指定された数 (2 番目のパラメーター) を割り当てる要素のサイズのメモリ内の要素の配列を割り当てます。さらにcalloc、この配列を 0 に初期化します。要素のサイズは 1 バイトよりも大きい場合があり、関数は必要なメモリ サイズを計算します。

malloc指定されたバイト数を割り当てる単一のパラメーターを取り、それへのポインターを提供します。さらに、mallocこのブロックを何にも初期化しません。

どちらの機能も基本的に同じ機能を提供します。

参考文献は次のとおりです。

malloc calloc

于 2012-09-23T20:23:30.197 に答える
-1

それは設計によるものです。

あなたはあなた自身のcallocを書くことができます

void *mycalloc(size_t num, size_t size)
{
    void *block = malloc(num * size);
    if(block != NULL)
        memset(block, 0, num * size);
    return block;
}
于 2012-09-23T20:29:46.457 に答える
-2

calloc (または malloc など) でオブジェクトを割り当てるべきではありません。calloc はそれをゼロで初期化しますが、C++ に関する限り、オブジェクトはまだ構築されていません。そのためにコンストラクタを使用します。

class MyClass
{
private:
    short m_a;
    int m_b;
    long m_c;
    float m_d;

public:
    MyClass() : m_a(0), m_b(0), m_c(0), m_d(0.0) {}
};

そして、それをnew(または可能であればスタック上で)インスタンス化します:

MyClass* mc = new MyClass();
于 2012-09-23T20:56:02.627 に答える