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

时间:2017-01-05 18:51:42

标签: c arrays dynamic scope

我有一个用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;
}

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

  

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

  for(arr_i=n-1; arr_i >= 0;arr_i--)

当我在第int个循环中的arr_i之前插入for时,错误就会消失。

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

4 个答案:

答案 0 :(得分:6)

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

引用C11,章节§6.2.1

  

[...]如果是声明符或类型说明符   声明标识符出现在块内或参数声明列表中   一个函数定义,标识符有块作用域,它终止于   相关块。 [...]

详细说明,for循环的可用sytax之一是

 for ( declaration expressionopt ; expressionopt ) statement

在您的情况下使用。由于arr_i的声明出现在for循环的子句-1 中,因此范围仅限于循环范围,因此,标识符在循环外是未声明的

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

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

注意:如您所述,

  

当我在第二个for循环中的“arr_i”之前插入int时,它会消失。

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

答案 1 :(得分:0)

正如Sourav Ghosh已经指出的那样,当你在for(这种情况)中声明一个变量时,该变量只存在于该循环中。例如:

void test ()
{
    int normal_variable = 5;
    {
        int local_variable = 10;//only exists here
        printf("It compiles: %d and work.\n", local_variable);
        printf("It also works: %d",normal_variable);
    }
    printf("Doesn't compile because doesn't exists: %d.",local_variable);
    printf("It also works, because it already exists: %d",normal_variable);
}

括号是使这成为可能的括号。 如果您想了解更多信息,请查看:

  

Where you can and cannot declare new variables in C?

答案 2 :(得分:0)

这就是for循环的一个很好的特性,与while循环相比,变量只与For块结构一样长,你可以在for block参数中声明它。因此,只需在结构之外(之前)声明它,您就会发现,了解有关范围和变量生命周期的更多信息。

int main(){
int n; 
scanf("%d",&n);
int *arr = malloc(sizeof(int) * n);
int arr_i = 0; 
for( ; 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;

}

同样查看你的代码n没有给出任何值,你可以解决它但它没有值(它实际上是一个未确定的值),malloc(sizeof(int)* n)将是4bytes *(未确定)..所以如果有的话,把它设置为0。我不确定这是否是一些伪代码,但这有错误,我会为你写,但既然你开始你应该自己做:)练习是完美的。如果您需要更多帮助,请说出评论。

答案 3 :(得分:0)

变量的范围是重要的。

第一个循环中的第一个声明具有该循环的范围

所以它在第二个循环中不可见。