2016-09-30 4 views
-4

が私のコードを見た値動作を停止:Cプログラムは、いくつかのアドレスを変更すると

#include <stdio.h> 
#include <limits.h> 

int main (int argc, const char *argv[]) { 

typedef unsigned char byte; 

byte *pointer; 
byte b1=1; 
byte b2=2; 
int i1 =4; 
int i2 =0x12345678; 
byte b3=5; 
byte b4=6; 
byte b5=7; 
byte b6=9; 

//pointer = &b6; 
pointer = (byte*)&i2; 
printf("pointer has value %p\n", pointer); 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
*pointer = 255; 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
*pointer = 45; 
printf("the byte it points to contains %x\n", *pointer); 
pointer = pointer + 1; 
*pointer = 34; 

printf("the byte it points to contains %x\n", *pointer); 
//printf("How big is int in this machine? %d\n", INT_MAX); 
//insert code here ... 
printf (" b1 (%p) = %x\n", &b1, b1); 
printf (" b2 (%p) = %x\n", &b2, b2); 
printf (" i1 (%p) = %d\n", &i1, i1); 
printf (" i2 (%p) = %x\n", &i2, i2); 
printf (" b3 (%p) = %x\n", &b3, b3); 
printf (" b4 (%p) = %x\n", &b4, b4); 
printf (" b5 (%p) = %x\n", &b5, b5); 
printf (" b6 (%p) = %x\n", &b6, b6); 

return 0; 
} 

言っライン*ポインタ= 255;同様に、この if I make , *pointer = 255 or *pointer = 254

and if I set any other values except this , my program works well i.e. *pointer = 4556 or *pointer = 45

または他の任意の値の場合を言っ、多分40行、コンパイラが吹く、またはコードは動作を停止し、それはどんな打撃なしで実行されます。このアドレスの動作について教えてください。

出典:Richard Buckland教授、私は彼のガイダンスのためにこれらのすべてを検討しています。

+11

あなたのコンパイラは爆破されませんでした。あなたのコンパイラはうまくいきます。あなたのプログラムは悪いです。 – Art

+0

あなたは 'pointer'値をあなたがダメージを与えるアドレスに移動しています。未定義の動作。 –

+0

よろしくお願いします。#ワインと#アート!私は、どのようにメモリが使用されているか、変数がどこに格納されているかを調べようとしていました。だから、変数_int i1_がプログラムに格納されていたアドレスの直下だったので、その場所に正確に何が格納されているか教えてください。フレームポインタのアドレスかクリティカルセクションですか? –

答えて

0

コンパイラはこれとは関係ありません。逆参照し、無効なポインタ、メモリに割り当てようとしていますが、あなたはを所有していません。

だけ++pointer; *pointer = <value>;を行うと、タイプintの単一の値にpointerポイント、そう++pointer(またはそれにゼロ以外の任意の番号を追加する)ように危険であるあなたは、おそらくへの書き込み権限を持っていないいくつかのメモリ位置にポインタを移動していますまたはアクセスすることさえできます。したがって、エラー。

+0

さて、ありがとう!私は、どのようにメモリが使用されているか、変数がどこに格納されているかを調べようとしていました。だから、変数_int i1_がプログラムに格納されていたアドレスの直下だったので、その場所に正確に何が格納されているか教えてください。フレームポインタのアドレスかクリティカルセクションですか? –

+1

@DivyanshuKushwaha、OSだけがそれを知っています。また、変数は、必ずしも連続したメモリにその宣言の順番で正確に格納されるとは限りません。 – ForceBru

+0

実際には、コンパイラは、コードと静的データが実行可能ファイルにどのようにレイアウトされているかを決定し、各関数内でローカルに格納される順序をスタックに格納します。 (OS Xは位置に依存しない実行可能ファイルを必要とするため、相対的順序のみが保証されています。絶対はランダムです)。 @DivyanshuKushwaha:すべての "通常"のアーキテクチャ(x86を含む)では、ローカル変数は関数の戻りアドレスの次に格納されるため、メモリに間違った値を書き込むとプログラムがクラッシュするのは全く正常です。プロセスのアドレス空間を探索する場合は、デバッガを使用します。 (そして/ Linuxでは/ proc/PID/mapsを見てください)。 –

関連する問題