-4

私のmain.c内容:

int main(int argc, char **argv)  
{  
    void * tmp = malloc(8);  
    ((double *)tmp)[0] = 100;  
    ((double *)tmp)[1] = 102;  
    printf("tmp %p\n", tmp);  
    printf("tmp[0] %d %f %p\n", sizeof(((double *)tmp)[0]), ((double *)tmp)[0], &((double *)tmp)[0]);  
    printf("tmp[1] %d %f %p\n", sizeof(((double *)tmp)[1]), ((double *)tmp)[1], &((double *)tmp)[1]);  
    return EXIT_SUCCESS;  
}  

=========================OUTPUT=========================  
tmp 0xee8010  
tmp[0] 8 100.000000 0xee8010  
tmp[1] 8 102.000000 0xee8018  
========================================================

まず、変数 tmp に 8 バイトのメモリを割り当て、アドレス 0xee8010 に番号 100 を割り当てました。

((double *)tmp)[0] = 100;  

また、番号 102 を未割り当てメモリ 0xee8018 に割り当てます。

((double *)tmp)[1] = 102;  

しかし、ビルド時でも実行時でもエラー メッセージは表示されませんでした。なぜだめですか?

これを理解するのを手伝ってください。ありがとうございました。

4

2 に答える 2

3

割り当てられていないメモリへの書き込み、または割り当てられたメモリの境界を超えた書き込みは、必ずしもクラッシュを保証しないUndefined Behavior (UB)になります。未定義の動作とは、UB が発生したときに
、コンパイラの実装が特定のことを行う必要がない (予想されるセグメンテーション違反など) 任意の動作を観察できることを意味します。

しかし、ビルド時と実行時にエラー メッセージは表示されませんでした。

言語標準に準拠していないコードのコンパイル時エラーが発生します。この場合、コードは言語標準に準拠しますが、結果が言語標準によって定義されていないことを行います。

于 2013-01-17T15:13:27.057 に答える
0

malloc() 呼び出しを常に free() と一致させることをお勧めします。エラーが発生しやすいもう 1 つの習慣は、キャストです。代わりにポインターが double として宣言されている場合は、malloc() でそのサイズを自動的に正しく取得し、誤ってポインターを変数にキャストしたり、その逆のリスクを軽減したりできます。

c はマシン コードに効率的にマップされるように設計されているため、c ではバッファー オーバーランの実行時の警告はありません。メモリ リークとバッファ オーバーランを検出するには、外部ツール valgrind http://valgrind.org/を使用してコードを分析します。この未定義の動作をトラップするために、メモリにアクセスするときに追加の命令が挿入されます。

    int main(int argc, char **argv)
    {
            double *tmp;
            if( tmp = malloc(2*sizeof(tmp)) ){
                    tmp[0]=100;
                    tmp[1]=102;
                    printf("tmp %p\n", tmp);
                    printf("tmp[0] %d %f %p\n", (int)tmp[0], tmp[0], &tmp[0]);
                    printf("tmp[1] %d %f %p\n", (int)tmp[1], tmp[1], &tmp[1]);
                    free(tmp);

                    //return EXIT_SUCCESS;  
                    return(0);
            }else{
                    //Malloc failed
                    return(-1);
            }
    }
于 2014-03-07T08:31:57.887 に答える