在C语言中,当我在编译时为指针分配值并打印值时,它们打印正确。
int main(void) {
int b;
int* a=&b;
for(int i=0;i<=5;i++){
*a=i;
a++;
}
a=&b;
for(int i=0;i<=5;i++){
printf("%d ", *(a+i));
}
return 0;
}
我得到的输出为:0 1 2 3 4 5
但是当我在运行时(使用scanf)分配值并打印值时,只有指针中的第二个值被指针的最后一个值替换。
int main(void) {
int b;
int* a=&b;
for(int i=0;i<=5;i++){
int t;
scanf("%d", &t);
*a=t;
a++;
}
a=&b;
for(int i=0;i<=5;i++){
printf("%d ", *(a+i));
}
return 0;
}
输入:0 1 2 3 4 5 输出:0 5 2 3 4 5
无论指针的大小如何,只有第二个元素被指针中的最后一个元素代替。 任何人都可以澄清这一点。
答案 0 :(得分:2)
这是未定义的行为。您正在访问a[0]
到a[5]
,这是6
整数的空间。但是,您只能容纳一个整数:
int b; // your one integer
int* a=&b;
如果增加a
,它将不再指向有效内存。尝试使用int
6
数组,而不是只使用一个int
:
int b[6];
int* a = b; // you can drop the "&" now as arrays decay to their pointers anyway
您可能会问自己“如果两次未定义的行为都为什么为什么第一次而不是第二次起作用?”。未定义行为的问题在于,不能保证特别做任何事情。 UB的常见表现是有时工作而其他时间不工作。它可能会给您带来预期的效果,并且似乎可以正常工作,然后在您尝试向客户端演示程序时突然失败。
顺便说一句,我是否有兴趣使用这种可读性更好的语法访问数组?
for (int i = 0; i <= 5; i++) {
a[i] = i;
}
for (int i = 0; i <= 5; i++) {
printf("%d ", a[i]);
}