C语言和数组声明中的“final”修饰符

时间:2014-10-20 19:57:18

标签: c arrays const

我正在为我的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?

3 个答案:

答案 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 /任何东西在这种情况下什么也得不到,因为在用于创建缓冲区后是否修改不会影响任何方式缓冲区的大小。