C语言 在 for 循环中使用 printf( )



尝试此操作时(下面的代码(,控制台甚至不请求输入值,然后吐出一个随机数(可能来自先前存储在该位置的数字(。

为什么这不起作用,我该如何解决?

int main( ) {
int arr[3];
for(int i = sizeof(arr); i <= 0; i--) {
scanf("%d", &arr[i]);
}
printf("%d", arr[2]);
return 0;
}

有两件事是错误的。

假设你想要数组中的元素数量,它就完成了,使用:

size_t len = sizeof(arr) / sizeof(*arr)

sizeof给出实际大小(为 arr 分配的字节数。

  1. 您应该从len - 1而不是len开始。

注意:数组索引是从 0 开始的,而不是从 1开始的,因此数组元素是从0 to 2索引的 但是你会尝试访问 arr[3],这可能会导致未定义的行为。

  1. 你写了i <= 0.所以,我从比方说2开始,是2 <= 0吗?不!

因此,它永远不会进入循环。正确的条件是i >= 0

int len = sizeof(arr) / sizeof(*arr);
for(int i = len - 1; i >= 0; i--)

好吧,我不知道你为什么要接受相反的顺序输入,但一般的惯例是使用以下方法进行输入:

size_t len = sizeof(arr)/sizeof(*arr);
for (i = 0; i < len; i++)
{
// take input
}

编辑: 从其他评论来看,您似乎不了解for循环。

看看这个答案

如有任何进一步的澄清,请发表评论。

i <= 0

代码永远无法进入循环,因为 i 的初始值大于零。

重要的是要注意,在 C 中,除了像 Java/Python 这样的语言之外,你必须明确知道数组的长度,sizeof不会给你数组中的项目数量。

int main() {
int arr[3];
int itemsInArray = 3;
for(int i = itemsInArray-1; i >= 0; i--) {
scanf("%d", &arr[i]);
}
printf("%d", arr[2]);
return 0;
};

由于i--会减小i的值,并且循环的条件是i <=0启动循环,因此i必须为 0 或负数。由于arr[3]将返回 12(3 个元素,每个元素有 4 个字节(int 有 4 个字节((,该值将是正值,大于 0,因此我们需要更改循环条件以检查i是否为正

#include <stdio.h>
int main( ) {
int arr[3]={0};
int i = sizeof(arr)/sizeof(arr[0]) -1;
for(; i >= 0; i--) {
scanf("%d", &arr[i]);
}
printf("%d", arr[2]);
return 0;
}

你的代码有几个问题:首先,sizeof(arr( 不会像你想象的那样返回"3";"arr" 是指向 arr[0] 的指针,因此您请求的是 int 指针的大小。
其次,i <= 0 甚至阻止循环被执行。
最后,请在声明时将数组设置为零,作为最佳实践,即:
int arr[3] = {0};

编辑:我拼错了我的想法:您正在请求为数组分配的整个内存区域的大小。
不过,下面的评论已更正。