我无法理解这段代码。我无法理解为什么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();
}
答案 0 :(得分:5)
此代码假设您的静态数据的内存布局如下所示:
+----+-----------------------------+----+
| sx | sa ..... | sy |
+----+-----------------------------+----+
因此,数组由sx
和sy
“限制”,因此使用其地址作为边界包括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覆盖sx
和sy
之间的每个记忆位置。它发生在sx
,sy
和sa
的每个元素都在这些内存地址中。
而且BTW代码对每个计算机中可能不正确的内存排列做出假设。