因此,我试图通过在每次循环运行时更新数组大小来根据用户的需要增加数组大小来动态分配内存,如您所见,如下代码所示。
正如您在这里看到的,我在开始时初始化了int score[n];
,并在for循环中再次初始化,因为我想动态更新数组的大小。尽管数组大小确实会动态更新,并且我能够在循环中存储这些值(我甚至可以打印出这些值(,但当我在break;
之后从循环中出来,并且score[n]
的数组大小再次变为1时,所有存储的数据都变得无用(被破坏(,尽管我已经给出了3个值
#include<stdio.h>
int main()
{
int n=1;
int score[n];
int sum=0;
float average;
for(int i=0;i<n;i++)
{
int score[n];
printf("enter scoresn");
scanf("%d",&score[i]);
int option;
printf("press 1 to add more scores or 0 to exitn");
scanf(" %d",&option);
if(option==0)
{
printf("The scores are:-n");
for(int i=0;i<n;i++)
{
printf("%dn",score[i]);
sum=sum+score[i];
}
average=sum/3.0; // to specify the computer to treat sum also as float I used 3.0
printf("The average is:- %f",average);
break;
}
n++;
}
}
我还分享了一张调试控制台的屏幕截图。这也是我之前输入的代码的屏幕截图。我上面展示的代码是更新的代码,这只是为了展示数组大小是如何动态分配的,但在break;
之后的循环中,数组大小出来后就变得毫无用处了
这是当我在for循环中时,数组值正在更新
在break;
后出环后
我对C真的很陌生,有人能告诉我这里到底发生了什么吗?如果不允许我再次重新声明同一个变量,我如何能够在for循环中声明它而不出现任何错误?当我们再次初始化同一个变量时,实际会发生什么?
在for循环的每次迭代之后,即使在我重新初始化score[n];
数组之后,数组如何正确存储值?为什么数组的存储值在循环中断后会被破坏,正如你在第二张图中看到的那样?
谢谢
实际发生的情况是,当您在for循环中声明int score[n]
时,它被分配了一个新的内存位置,您可以使用printf("%pn", score);
进行检查,其作用域仅限于for循环,因此您可以在该块中重新声明(for循环(。因此,在执行"break"并退出循环后,初始int score[n]
自声明以来没有更改,因此是一个空数组,因此也是您的输出。关于int score[n]
在循环内部打印和更新其代码。现在,关于数组如何动态存储值,我们知道数组将值存储在连续内存中,因此如果空间空闲,它将继续存储值,请注意,您使用的是score[i] in scanf() not score[n],
,由于"i"在每次迭代中不断增加,当我们在for循环中声明int score[n]
时,值将不断添加到内存块中。由于块与分数数组的地址相同,因此不会发生变化(再次使用printf("%pn", score);
进行检查(,因此随着"i"的每次增加,它都会在数组中存储值。
首先,代码中的问题是for
循环外部的score
与for
循环内部的score
不同。如果你试图";重新声明";score
与您所做的一样,在for循环之外,您的程序不会编译。当您退出for循环时,您一直在处理的分数将被删除,就像在每个循环迭代中一样
你在欺骗自己,让自己相信你的分数数组没有重置,因为你在内存方面很幸运,但在测试你的代码时,我会不时地得到随机值。
enter scores
45
press 1 to add more scores or 0 to exit
1
enter scores
46
press 1 to add more scores or 0 to exit
1
enter scores
47
press 1 to add more scores or 0 to exit
1
enter scores
48
press 1 to add more scores or 0 to exit
1
enter scores
50
press 1 to add more scores or 0 to exit
1
enter scores
52
press 1 to add more scores or 0 to exit
0
The scores are:-
4
0
626127794
21878
50
52
必须使用指针malloc和realloc来动态更改数组大小,我强烈建议您学习如何使用它们。
如果你想从更简单的事情开始:为什么不在一开始就将数组的大小设置为较大的值(比如1000(,并防止用户输入超过该值的值呢?
另一方面,average = sum/3.0;
应该是average = sum/(float)n;
快乐学习