2017-11-09 14 views
1

n1のメモリ番地を実行した後、n2、* pnはADDR:0061FF2C、0061FF28、0061FF24となりました。 1)、2)、3)の実行後に変更されますか?私はすべてのコードに対してprintfを書いていますが、変更されていないようです。理論的には、変数に新しい値が割り当てられているため、変数を変更しないでください。新しい宣言後にメモリアドレスが変更されますか?

#include <stdio.h> 
int main(void) 
{ 
    int n1=3, * pn = &n1; 
    int n2=0; 

    printf("%p, %p, %p\n", &n1, &n2, &pn); // 0) 
    n2 = *pn;       // 1) 
    *pn = n2 + 1;     // 2) 
    n1 = *pn + *(&n2);      // 3) 
    printf("%d, %d, %d\n",n1,n2,*pn);   // 4) 
    return 0; 
} 
+0

O/T - 'printf'が予期しているようにそれらのアドレスを' void * 'にキャストする必要があります。そうでない場合は未定義の動作です:https://stackoverflow.com/questions/9053658/correct-format-specifier-to-print-ポインタアドレス – yano

答えて

5

私たちは、標準はこれについて言っているか見てみましょう - オブジェクトの寿命が保存が保証されている間、プログラムの実行の一部である

§6.2.4p2

C11を引用

それのために予約される。オブジェクトが存在し、一定のアドレス、[33]を持ち、その存続期間を通して最後に格納された値を保持します。 [...]

C11を引用

、章§note33

用語「定数アドレス」は、おそらく異なる時間に構築されたオブジェクトへの2つのポインタが等しいとすることを意味します。アドレスは、同じプログラムの2つの異なる実行中に異なる場合があります。

は今ここに私たちが持っているオブジェクトがn1n2pnです。これらの3つのすべてに自動保存期間があります。これらに構築

したがって任意の二つのポインタも同じ比較する異なった時間の間(第一printf&n1&n2&を使用して)。これは、実行中に値が変化しても当てはまります。

1

いいえ、メモリアドレスは変更されません。変数に新しい値を代入しても、変数のメモリアドレスは決して変更されないためです。これが当てはまる場合、ポインタ変数に変数のアドレスを格納することは無意味であり、そうではありません。

関連する問題