我正在为我的C语言课程做一个家庭作业(不用担心,我不需要你们为我解决任何问题!)我对设计有疑问。我试图通过读取文件中的输入来弄清楚如何安全地设置数组的大小。
最初我是这样写的:
fscanf(ifp, "%d", &number_of_pizzas);
float pizza_cost[number_of_pizzas];
我很确定这会很好,但我知道声明一个可变大小的数组是不明智的。我的作业指定数组不能超过100,所以我知道我可以写" pizza_cost [100]",但我宁愿这样做而不是浪费内存。
Java是我最熟悉的语言,我相信问题的解决方案会像这样写出来:
Scanner s = new Scanner(System.in);
final int i = s.nextInt();
int[] array = new int[i];
我知道C没有最后一个关键字,所以我假设" const"将是要走的路...有没有办法将该代码复制到C?
答案 0 :(得分:2)
我很确定这会很好,但我知道声明一个可变大小的数组是不明智的。
仅在大小没有上限的情况下才是这样。如果您知道number_of_pizzas
为100或更少,那么除了大多数内存受限的系统之外,您的声明都是安全的。
如果在声明可变大小数组之前更改代码以验证number_of_pizzas
,那么您将是安全的。但是,此数组的范围将限制为函数,因此您无法将其返回给函数的调用者。
与Java代码类似,如下所示:
float *pizza_cost = malloc(sizeof(float)*number_of_pizzas);
现在你的数组可以从一个函数返回,但你有责任通过调用free(pizza_cost)
至于使number_of_pizzas
成为const
,它将无法与scanf
一起使用:通过指针修改const
是违法的。即使在Java中它也没什么用处,因为你可以通过访问数组length
获得相同的值。
答案 1 :(得分:0)
您的代码将构建正常。运行良好取决于输入值。
我只会为此添加一项改进;在使用之前测试数组初始值设定项的限制:
fscanf(ifp, "%d", &number_of_pizzas);
if((number_of_pizzas > MIN_SIZE) &&(number_of_pizzas < MAX_SIZE))//add this test (or something similar)
{
float pizza_cost[number_of_pizzas];
//do stuff
}
选择对您的应用程序有意义的MIN_SIZE和MAX_SIZE值...
使用动态分配执行相同的操作:
fscanf(ifp, "%d", &number_of_pizzas);
if((number_of_pizzas > MIN_SIZE) &&(number_of_pizzas < MAX_SIZE))//add this test (or something similar)
{
float pizza_cost = malloc(sizeof(float)*number_of_pizzas);
//do stuff
}
完成后不要忘记使用free(pizza_cost);
。
答案 2 :(得分:0)
任何动态表达式都可以很容易地限制其值:
fscanf(ifp, "%d", &number_of_pizzas);
float pizza_cost[number_of_pizzas > 100 ? 100 : number_of_pizzas];
只要边界是常数,这不会比使用常数值更安全,并且如果所需的数量更少,则可能更小。
使变量const
/ final
/任何东西在这种情况下什么也得不到,因为在用于创建缓冲区后是否修改不会影响任何方式缓冲区的大小。