0

このコードを理解できません。sx、sa、syの値が同じで、42を意味する理由がわかりません。ポインターを使って何かをしなければならないことは理解しています。誰かが説明できれば

#include <stdio.h> 

static int sx;
static int sa[100];
static int sy;

int main() {
    int *p;
    for(p=&sx; p <=&sx+200; p++) 
    {
        *p = 42;
    }   
    printf("sx = \t%i\n",sx);
    printf("sa[0] = \t%i\n",sa[0]);
    printf("sa[109] = \t%i\n",sa[109]);
    printf("sy = \t%i\n",sy);

    getchar();
}
4

3 に答える 3

5

このコードは、静的データのメモリレイアウトが次のようになっていることを前提としています。

+----+-----------------------------+----+
| sx | sa .....                    | sy |
+----+-----------------------------+----+

したがって、配列はとによって「制限」されるため、それらのアドレスを境界として使用するsxと、のすべての要素が含まれます。この場合も、それはおそらくカバーし、それからかなり多くを使用しています(ポインタ演算がスケーリングされていることを忘れないでください)。sysa&sx + 200sa

厳密に言えば、これは未定義の動作であり、これに依存することはできません。しかし、それがあなたのために働く理由です。

于 2013-03-27T04:41:09.170 に答える
2

あなたは変数の範囲を超えて書いているので、それは未定義の振る舞いです。

for(p=&sx; p <=&sx+200; p++) 
{
    *p = 42;
}   

このコードフラグメントは、割り当てられたメモリを超えて書き込み、sx未定義の動作を引き起こします。注pはポインタでsxありsx、単一の整数であり、配列ではありません。ループは、に割り当てられたメモリを超えて反復および書き込みを行いますsx

未定義動作は必ずしもプログラムのクラッシュを強制するものではなく、単にプログラムの出力が何でもよいことを意味します。動作するかどうか、または奇妙な結果が表示される場合があります。簡単に言えば、どのような結果でも可能です。

于 2013-03-27T04:39:24.723 に答える
0

まず、そこにあなたの上書きメモリ。したがって、ポインタで遊んでみたい場合は、これを変更してください。

for(p=&sx; p <=&sx+200; p++)

に:

for(p=&sx; p <=&sy; p++)

さて、あなたがしていることは、値42の間のすべてのメモリ位置を上書きすることです。そして、、、sxおよびのすべての要素がそれらのメモリアドレスにあることが起こります。sysxsysa

そしてところで、コードはすべてのコンピュータに当てはまらないかもしれないメモリ配置についての仮定をします。

于 2013-03-27T04:45:34.450 に答える