-1
#include <stdio.h>
#include <stdlib.h>

int main(void)
{      
  int *arr = (int*)malloc(10);
  int i;
  for(i=0;i<100;i++)
  {
    arr[i]=i;
    printf("%d", arr[i]); 
  }
  return 0;
}

私は上記のプログラムを実行しており、malloc を呼び出すと 10 バイトのメモリが割り当てられます。各 int 変数は 2 バイトを使用するため、ある意味で、それぞれ 2 バイトの 5 つの int 変数を格納できるため、動的に割り当てた合計 10 バイトを構成できます。 .

しかし、for-loop を呼び出すと、99 番目のインデックスまで値を入力でき、これらすべての値も格納できます。つまり、100 個の int 値を格納している場合、200 バイトのメモリを意味しますが、10 バイトしか割り当てませんでした。

では、このコードのどこに欠陥があるのでしょうか、それとも malloc はどのように動作するのでしょうか? malloc の動作がこのように非決定論的である場合、どうすれば適切な動的メモリ処理を実現できるでしょうか?

4

5 に答える 5

2

欠陥はあなたの期待にあります。実際に 100*sizeof(int) バイトを書き込んだときに、「10 バイトしか必要ない」とコンパイラーに嘘をつきました。割り当てられた領域を超えて書き込むことは未定義の動作であり、何も起こらないことからクラッシュが予想されることまで、あらゆることが起こる可能性があります。

于 2013-08-03T11:18:30.017 に答える
1

ばかげたことをするなら、ばかげた振る舞いを期待する。

これmallocは通常、OS が好むメモリのチャンク (ページなど) を OS に要求し、そのメモリを管理するために実装されます。これにより、特に小さいサイズの malloc を多数使用している場合に、今後の malloc が高速化されます。これにより、非常にコストのかかるコンテキスト スイッチの数が削減されます。

于 2013-08-03T10:56:50.217 に答える
0

まず、ほとんどのオペレーティング システムでは、int のサイズは 4 バイトです。次の方法で確認できます。 printf("the size of int is %d\n", sizeof(int)); malloc 関数を呼び出すと、ヒープ メモリにサイズが割り当てられます。ヒープは、動的割り当て用に確保されています。ヒープからのブロックの割り当てと割り当て解除に強制されるパターンはありません。いつでもブロックを割り当て、いつでも解放できます。これにより、ヒープのどの部分が割り当てられているか、またはいつでも解放されているかを追跡することがはるかに複雑になります。あなたのプログラムは小さく、ヒープに衝突がないので、これを 100 以上の値で実行することができ、それも実行されます。malloc で何をしているのかがわかったら、適切な動的メモリ処理を使用してプログラムを作成します。コードに不適切な malloc 割り当てがある場合、プログラムの動作は「不明」です。ただし、gdb デバッガーを使用して、セグメンテーションが明らかになる場所とヒープ内の状況を見つけることができます。

于 2013-08-03T11:16:55.803 に答える
0

malloc記載されているとおりに動作し、nバイトのメモリを割り当てます。それ以上は何もありません。コードは PC 上で実行される可能性がありますが、割り当てられていないメモリでの操作は未定義の動作です。

ちょっとしたメモ...

Int は 2 バイトではない場合があり、アーキテクチャや SDK によって異なります。n 個の整数要素にメモリを割り当てたい場合は、 を使用する必要がありますmalloc( n * sizeof( int ) )

つまり、言語が提供する他のツール ( 、、など)を使用して動的メモリを管理しますsizeofreallocfree

于 2013-08-03T11:14:40.837 に答える