gpt4 book ai didi

c - 为什么在C语言中运行时赋值(使用scanf)时,值不能正确存储在指针中?

转载 作者:行者123 更新时间:2023-11-30 20:02:59 25 4
gpt4 key购买 nike

在 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

但是,无论指针的大小如何,只有第二个元素会被指针中的最后一个元素替换。谁能澄清一下。

最佳答案

这是未定义的行为。您正在访问 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]);
}

关于c - 为什么在C语言中运行时赋值(使用scanf)时,值不能正确存储在指针中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57094963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com