C数组错误 - 要求我两次声明相同的变量

Raj*_*jee 1 c arrays scope dynamic

我有一个用c编写的代码,基本上它需要一个数组并向后打印.一个非常基本的东西.这是代码:

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>

int main(){
    int n; 
    scanf("%d",&n);
    int *arr = malloc(sizeof(int) * n);
    for(int arr_i = 0; arr_i < n; arr_i++)
    {
       scanf("%d",&arr[arr_i]);
    }
    for(arr_i=n-1; arr_i >= 0;arr_i--)
    {
      printf("%d ",arr[arr_i]);   
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

第二个for循环出现以下错误:

solution.c:17:9:错误:'arr_i'未声明(首次使用此函数)

  for(arr_i=n-1; arr_i >= 0;arr_i--)
Run Code Online (Sandbox Code Playgroud)

当我在第二个循环int之前插入时,错误消失了.arr_ifor

所以,我怀疑的是,为什么即使我已经arr_i在第一个for循环中声明,它要求我在第二个for循环中再次声明它?

Sou*_*osh 6

范围arr_i仅限于第一个for循环.在第二个循环中,是不活的.

引用C11,第6.2.1章

[...]如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表中,则标识符具有块作用域,该作用域终止于关联块的末尾.[...]

详细说明,其中一个可用的sytax for for循环是

 for ( declaration expressionopt ; expressionopt ) statement
Run Code Online (Sandbox Code Playgroud)

在你的情况下使用.由于声明arr_i出现在循环的第1节for,因此范围仅限于循环范围,因此,此标识符在循环外未声明.

如果希望在两个循环中使用相同的变量,请在整个函数的块作用域中定义变量,在本例中为main()函数.

也就是说,一般建议,malloc()在使用返回的指针之前总是检查成功.

注意:如你所说,

当我在第二个for循环中的"arr_i"之前插入int时它会消失.

值得一提的是,在这种情况下,在两个不同的范围内存在两个不同的变量.它们不是同一个变量.