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



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

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

所以,我的疑问是,为什么尽管我已经在第一个for循环中声明了arr_i,但它要求我在第二个for循环中再次声明它?

arr_i的作用域仅限于第一个for循环。在第二个循环中,is不存在。

引用C11,第6.2.1章

〔…〕如果声明符或类型说明符声明该标识符显示在块内或中的参数声明列表中函数定义,标识符具有块作用域,块作用域终止于关联块。[…]

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

for ( declaration expressionopt ; expressionopt ) statement

在您的案例中使用。由于arr_i的声明出现在for循环的子句1中,因此作用域仅限于循环作用域,因此,此标识符在循环外未声明

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

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

注意:如您所述,

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

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

与while循环相比,for循环实际上有一个很好的特性,该变量的寿命仅与for块结构一样长,您可以在for块参数中声明它。因此,只需在结构外(之前)声明它,您就会发现,了解更多关于作用域和变量生存期的信息。

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。我不确定这是否是一些伪代码,但其中充满了错误,我会为您编写它,但既然您刚开始,您应该自己动手:)熟能生巧。如果你需要更多的帮助,就说这句话。

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);
}

括号使这成为可能。如果你想阅读更多关于它的信息,请查看以下内容:

在C中可以和不能声明新变量的地方?

变量的作用域才是最重要的。

第一个循环中的第一个声明具有该循环的作用域

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

最新更新