5

SOで見つかった同様の質問かもしれません。しかし、私はそれを見つけませんでした、これがシナリオです

ケース1

void main()
{
    char g[10];
    char a[10];
    scanf("%[^\n] %[^\n]",a,g);
    swap(a,g);
    printf("%s %s",a,g);
}

ケース 2

void main()
{
    char *g=malloc(sizeof(char)*10);
    char *a=malloc(sizeof(char)*10);
    scanf("%[^\n] %[^\n]",a,g);
    swap(a,g);
    printf("%s %s",a,g);
}

どちらの場合も同じ出力が得られます。それで、私の質問は、またはその逆malloc()の代わりにいつ好むべきarrayか、そしてその理由は?? 共通の定義を見つけ、malloc()動的割り当てを提供します。それで、それはそれらの間の唯一の違いです?? dynamicでサイズを指定していますが、 とはどういう意味ですか? 誰か例を挙げて説明してくださいmalloc()

4

3 に答える 3

6

主な違いは、配列の長さを決定する時期と方法に関連しています。固定長配列を使用すると、コンパイル時に配列の長さを決定する必要があります。対照的に、 using を使用mallocすると、実行時に配列の長さを決定できます。

特に、実行時に決定することで、コンパイル時には不明な情報に基づいて、ユーザー入力に基づいて決定を下すことができます。たとえば、配列を、ユーザーが入力した実際のデータに適合するのに十分な大きさになるように割り当てることができます。固定長配列を使用する場合は、コンパイル時に上限を決定し、その制限をユーザーに強制する必要があります。

もう 1 つのより微妙な問題は、非常に大きな固定長配列をローカル変数として割り当てると、スタック オーバーフローの実行時エラーが発生する可能性があることです。そのため、 を使用してそのような配列を動的に割り当てることを好む場合がありますmalloc

于 2012-12-23T18:44:39.510 に答える
2

サイズを指定していますが、動的とはどういう意味ですか、誰か例を挙げて説明してください。

これは C99 より前は重要だったと思います。C99 より前は、動的にサイズ変更された auto 配列を使用できませんでした。

void somefunc(size_t sz)
{
    char buf[sz];
}

C99 は有効ですが、C89 は無効です。ただし、 を使用すると、任意の値を指定できます。定数を引数としてmalloc()呼び出す必要はありません。malloc()

また、他の目的を明確にするmalloc()ために、関数からスタックに割り当てられたメモリを返すことはできないため、関数が割り当てられたメモリを返す必要がある場合は、通常、 (またはおよびmalloc()を含む malloc ファミリの他のメンバー) を使用してメモリのブロックを取得します。これを理解するには、次のコードを検討してください。realloc()calloc()

char *foo()
{
    char buf[13] = "Hello world!";
    return buf;
}

はローカル変数であるためbuf、それを囲む関数の最後で無効化されます。これを返すと、未定義の動作が発生します。上記の関数は誤りです。ただし、を使用して取得したポインターは、malloc()関数呼び出しを通じて有効なままです (呼び出しを行わない限りfree())。

char *bar()
{
    char *buf = malloc(13);
    strcpy(buf, "Hello World!");
    return buf;
}

これは絶対に有効です。

于 2012-12-23T18:48:47.443 に答える
0

この特定の例では、[malloc のオーバーヘッドにより] 表示されるよりも多くのメモリが配列に割り当てられているため、malloc() は非常に無駄であり、malloc() を呼び出すのに時間がかかることを付け加えておきます。 free() - そして、プログラマーがそれを解放することを覚えておくためのオーバーヘッドがあります - メモリリークはデバッグが非常に難しい場合があります.

編集:適切な例として、あなたのコードには main() の最後に free() がありません - ここでは問題にならないかもしれませんが、それは私の要点をよく示しています。

そのため、通常、小さな構造体 (100 バイト未満) をスタックに割り当てる必要があります。大きなデータ構造がある場合は、それらを malloc で割り当てることをお勧めします (または、それが正しい場合はグローバルを使用しますが、これはデリケートな問題です)。

明らかに、何かのサイズが事前にわからず、サイズが非常に大きい (サイズがキロバイト) 場合がある場合は、間違いなく「malloc の使用を検討する」場合です。

一方、最近のスタックは (少なくとも「実際のコンピューター」では) 非常に大きいため、数キロバイトのスタックを割り当てることは大したことではありません。

于 2012-12-23T18:56:52.937 に答える