4

私は自分のCの概念を少しブラッシュアップしていて、いくつかの動作について混乱していました。次のコードスニペットについて考えてみます。

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

int main (){


    int * arr;
    arr= malloc(3*sizeof(*arr));
    arr[0]=1;
    arr[1]=2;
    arr[2]=3;
    arr[3]=4;
    printf("value is %d \n", arr[3]);

return 0;


}

問題は、プログラムが正しく機能することです。私が理解している限り、私は3つの整数の配列にメモリを割り当てます。したがって、基本的に値を入力しようとすると、メモリが割り当てられていないarr[3] ため、が存在するはずです。segmentation faultしかし、それは正常に動作し、値4を出力します。これは奇妙な動作であるか、基本的なCを真剣に改訂する必要があります。誰かが説明を提供していただければ幸いです。ありがとう。

4

4 に答える 4

10

技術的には、これはUndefined Behaviorです。これは、必ずしもセグメンテーション違反ではなく、何かが発生する可能性があることを意味します。
あなたのプログラムは有効なプログラムではありません。無効なプログラムを作成して、それらから有効/無効な動作を期待するべきではありません。

于 2012-06-10T12:07:19.697 に答える
6

いつでもセグメンテーション違反が発生する可能性がありますが、今回は「幸運」でした。これは未定義の動作であるため、別の機会にセグ フォールトが発生する可能性があります。

C は境界チェックをまったく行わないため、例えば Java は不平を言うかもしれませんが、C は、プログラム自身の不利益であっても、あなたが要求したことは何でも喜んで実行します。

これは、その主要な強みの 1 つであると同時に、弱点でもあります。

于 2012-06-10T12:07:49.447 に答える
3

あなたのプログラムには未定義の動作があります。これは、セグメンテーション違反が保証されているという意味ではありません。障害は、他の方法で現れる可能性があります (またはまったく現れない)。

于 2012-06-10T12:07:22.210 に答える
2

メモリがどのように割り当てられているかについての私の理解に基づく私の推測は次のとおりです(間違っている可能性があります-間違っている場合は投票してください!):

のアドレスはarr[3]、アプリが書き込み権限を持つメモリ ページにあります。4KBが一般的なページサイズだと思います。malloc呼び出しの結果、1 ページがアプリにマップされました。そのうちの最初のバイトのみを使用しているため、アプリが書き込み権限を持っているが、まだ発行していない3*sizeof(*arr)スペースが残っています。別の方法を実行した場合、返されるアドレスは のアドレスよりも大きくなり、同じになる可能性があります。arr[2]mallocmallocarrarr[3]

于 2012-06-10T12:58:27.283 に答える