为什么值相同?

时间:2013-03-27 04:37:00

标签: c

我无法理解这段代码。我无法理解为什么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();
}

3 个答案:

答案 0 :(得分:5)

此代码假设您的静态数据的内存布局如下所示:

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

因此,数组由sxsy“限制”,因此使用其地址作为边界包括sa的所有元素。在这种情况下,它也使用&sx + 200,它可能涵盖sa,然后更多(记住,指针算术被缩放)。

严格地说,这是未定义的行为,你不能依赖于此。但是,这就是为什么它适合你。

答案 1 :(得分:2)

您正在编写超出变量范围的内容,因此它是未定义的行为

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

此代码片段写入超出为sx分配的内存并导致未定义的行为。注意p是指向sx的指针,sx只是一个整数,而不是数组。循环迭代并写入超出为sx分配的内存。

未定义的行为并不一定要求程序崩溃,它只是意味着程序的输出可以是任何东西。它似乎工作与否或显示一些奇怪的结果,简单来说,任何结果都是可能的。

答案 2 :(得分:0)

首先,你在那里覆盖内存。所以如果你想玩指针改变这个:

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

为:

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

现在,你正在做的是用值42覆盖sxsy之间的每个记忆位置。它发生在sxsysa的每个元素都在这些内存地址中。

而且BTW代码对每个计算机中可能不正确的内存排列做出假设。