2017-10-11 14 views
-2

charポインタにスペースを割り当てて、割り当てられたスペースを越えてアクセスしようとしましたが、まだセグメンテーション違反は発生しませんでした。私のコードは以下のようになります:割り当てられたスペースを越えてセグメンテーションが発生しない

char *src = malloc(4); 
    strcpy(src, "1234"); 
    char *temp; 
    for(int i = 0 ; i<5 ; i++) { 
     temp = src; 
     srC++;  
     printf("ite ch %c\n",src[0]); 
    } 
    printf("Still no segfault %s\n",temp); 

私の質問は次のとおりです。セグメンテーションフォルトを取得してはいけませんか?

+5

未定義の動作は未定義です。それがまったく検出される保証はありません。 – Deduplicator

+0

Cは低レベルの語彙です。喜んであなたが好きな足で自分を撃つことができ、あなたに警告するかもしれません。 –

+1

「セグメンテーション違反はありませんか?」いいえ、Cではsegaultが指定されていません。 _それは起こるでしょう。それはUBです。他の言語では、segフォルトが発生しなければならないと指定することがあります。これにはしばしば特別なコードやパフォーマンスが必要です。 [トレーニングホイール](https://en.wikipedia.org/wiki/Training_wheels)が必要な場合は、他の言語も検討してください。 – chux

答えて

1

ここで行ったように、mallocによって割り当てられたメモリブロックの末尾を超えて書き込みを行うと、undefined behaviorが呼び出されます。

未定義の動作は、プログラムの動作を予測できないことを意味します。クラッシュしたり、奇妙な結果を出力したり、正しく動作するように見える可能性があります。また、未使用のローカル変数やprintfの呼び出しをデバッグ用に追加するなど、一見無関係な変更は、未定義の動作がどのように現れるかを変更する可能性があります。

要約すると、未定義の動作では、プログラムがクラッシュする可能性があるという意味ではありません。

0

malloc()関数の実装は、システムとライブラリ固有です。多くのメモリ割り当ての実装で対処しなければならないことの1つは、メモリの断片化です。

質問コードは4バイトを割り当てます。メモリの断片化を最小限に抑えるために、多くのシステムでは実際に4つ以上を割り当てます。おそらく最低16バイトです。このようにすると、malloc(4)要求を満たすだけでなく、(メモリが解放されると)メモリフラグメントが最小サイズの16バイトに保持されます。したがって、1バイトから16バイトのmalloc()要求を満たすために、16バイトのフラグメントの「メモリフラグメントプール」を使用できます。

多くのメモリ管理システムでは、それぞれ16,32,64,128などの「メモリフラグメントプール」が維持されています。たとえば、malloc(44)の呼び出しが行われた場合、64バイトプールのメモリフラグメントが要求を満たすことができます。

一部のシステムでは、malloc()によって返されるメモリフラグメントの実際のサイズを判断する手段があります。 Linuxシステムでは、関数malloc_usable_size()がこの関数を実行します。 OS Xシステムでは、malloc_size()を使用できます。

関連する問題