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和“界定” sy,因此使用它们的地址作为边界包括 的所有元素sa。在这种情况下,它也使用&sx + 200which 可能覆盖sa然后更多(请记住,指针算术是缩放的)。

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

于 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 回答