2010-12-01 12 views
3

上記のプログラムをgccコンパイラ(www.codepad.org)で実行すると、出力が となり、システムコールが許可されない:SYS_socketcall このエラー/出力がなぜ発生するのか誰にも分かりませんか?私が観察したものポインタの割り当て問題

int main() { 
    int i=8; 
    int *p=&i; 
    printf("\n%d",*p); 
    *++p=2; 
    printf("\n%d",i); 
    printf("\n%d",*p); 
    printf("\n%d",*(&i+1)); 
    return 0; 
} 

は、私がアクセス不能になっている私が実行した後* ++のp = 2; WHY?

答えて

5

*p = &iを実行すると、pは1つの整数iを指します。 ++ppをインクリメントして "次の"整数を指すが、iは配列ではないため、結果は未定義である。

+0

正解ありがとう。 – hari

+0

次のコードはうまく動作します メイン INT(){ INT I = 8; INT * P =&I; のprintf( "\ n%D"、* P); * ++ P = 2; // のprintf( "\ n% d "、i); printf(" \ n%d "、* p); // printf( "\ n%d"、*(&i+1)); return 0; } これは、問題が* ++ p = 2のために問題であることを意味します。割り当てられていないメモリにアクセスしていますが、問題はありません。* ++ p = 2 pは値2の場所を指します。混乱は、それが私の価値を変化させないのですか?私はなぜ不得手になるのですか? – sudhansu

+0

私は配列ではありませんが、* ++ p = 2.iには4バイトしか割り当てられていないので、その値は変更されません.pは4バイト後の位置を指します.SOなぜアクセスできないのですか? – sudhansu

2

あなたが観察しているのは未定義の動作です。具体的には、の*++p=2の逆参照は、少なくとも2つのメンバーを持つ配列ではないため、iは禁止されています。実際には、あなたのプログラムは、アドレスが&i + sizeof(int)であるメモリに書き込みを試みる可能性が最も高いです。

1

定義されていない動作をスタック上の未定義領域に書き込むことによって、が呼び出されています。 codepad.orgは、許可されていないことを行おうとするプログラムに対して保護を与えており、あなたの未定義の行動プログラムがそれを引き起こしたようです。

自分のコンピュータでこれを実行しようとすると、プログラムはおそらく別の方法(セグメンテーションフォールトやバスエラーなど)でクラッシュすることになります。

1

式1つのint前方を指すように*++p最初の移動ポインタp(すなわち、ポインタが無効になる)、次いで得られたポインタを間接参照し、そこに番号2を保存しようとし、したがって無効なメモリに書き込みます。

*p = 2または(*p)++を意味する可能性があります。

+0

次のコードは正常に動作します。 int main(){ int i = 8; int * p =&i; printf( "\ n%d"、* p); * ++ p = 2; // printf( "\ n%d"、i); printf( "\ n%d"、* p); //のprintf( "\ n%D"、*(&i+1)); 戻り0; } これが問題に起因NTであることを意味* ++ P = 2.Though iが割り当てられていないメモリにアクセスし、その問題をNT。 AFTER * ++ p = 2 pは値2の場所を指していますが、混乱してi.SOの値が変化しないのですか? – sudhansu

0

あなたのコードは、それが所有していないメモリにアクセスし、その結果は未定義です。それが現在書かれているよう

あなたのすべてのコードが実行する権利を持っている&pで読み、サイズsizeof(int)のエリアメモリからの書き込み&iで、サイズsizeof(int*)の別のことです。

次の行はすべて、データの読み取りまたは書き込みが許可されている範囲外のメモリアドレスを使用して、これらの制約に違反します。

*++p=2; 

printf("\n%d",*p); 
printf("\n%d",*(&i+1)); 
0

オペレーター++は、引数を変更するので、ライン*++p=2;おそらくcall frameポインタpをインクリメントを規定するスタック上の場所に2を割り当てます。一度あなたがコールフレームを台無しに - すべての賭けはオフです - あなたは壊れた状態に終わる。

関連する問題