2016-07-07 12 views
-6

ヒープ領域の1バイトのアドレスを指す整数ポインタを使用しました。 次にintegerポインタにmax integerの値を代入しました。printf文の出力は、正しい値ではなくガベージ値でなければなりません。どうすれば可能ですか?説明してください。私は1バイトのスペースを割り当てるので、4バイトの最大整数をどのように印刷することができますか?

#include<stdio.h> 
#include<stdlib.h> 
#include<limits.h> 
int main() 
{ 
    int *i; 

    i=malloc(sizeof(char)); 

    *i=INT_MAX; 
    printf("%d",*i); 
    return 0; 
} 
+2

だから、あなたは記憶から何かを盗んで、検出されずに逃げます。それは法的窃盗を法的にしますか?オラフ@ – Olaf

+0

は、申し訳ありません私はあなたがあなたがあなたに属していない3つのバイトを使用している –

+0

言いたかったのか理解できません。彼らはそこにいるわけではないし、プログラムはあなたのものとしてそれらを扱うことが幸せですが、それは依存することはできません。完全に動作する可能性がありますが、クラッシュする可能性があります。 –

答えて

3

Cには、コンパイル時も実行時でもチェックする境界がありません。割り当てられたメモリの境界から書き出すと、は未定義の動作になります。

+0

は、実は、私は、ヒープに1つのバイトのメモリを割り当てられたかどうかを知りたかった、そしてまたmaximimである4バイトの整数値は、1バイトのmemory.pleaseに割り当てられている方法を詳細に説明します。 –

+1

割り当てられた領域の後の領域にあるものを上書きして、未定義の動作を引き起こします。ちょうどクラッシュしたり、うまく動作したり、コンピュータを爆破したり、イギリス人をユーロ圏から出させたりすることができます。 – FredK

+2

10人用に設計されたエレベーターに20人を押し込むとどうなりますか? 2つの結果:それは幸運にもうまくいくか、エレベーターがクラッシュするでしょう。しかし、実際に最初の結果が期待されますか? –

1

メモリ境界外で読み書きを行うと、undefined behaviorが呼び出されます。

これは、プログラムがクラッシュする可能性があり、予期せず動作したり、不明な値を出力したりする可能性があることを意味します。あなたのプログラムが予想された値を出力したという事実は、それに依存することはできません。

あなたのシステムではmallocの実装と、割り当てられたメモリをどのように追跡するのか、割り当てにバッファスペースを使用するかどうかが関係しているでしょう。しかし、再び、あなたはこれに依存することはできません。

関連する問題