在使用C语言在运行时(使用scanf)分配值时,为什么值未正确存储在指针中?

时间:2019-07-18 12:54:35

标签: c pointers

在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

无论指针的大小如何,只有第二个元素被指针中的最后一个元素代替。 任何人都可以澄清这一点。

1 个答案:

答案 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]);
}