嘿,我正在处理一个问题,这就是我要做的事情: -
编写一个名为initarray的函数,它接受一个指向int的指针数组和一个表示数组大小的int作为参数。该函数应使用指向int的指针(使用malloc)初始化数组,该指针具有与存储指针的数组索引相对应的值(存储在数组索引2处的指针应指向值为2的整数)
到目前为止,我已经写了这个,但它给了我一个错误" [错误]可变大小的对象可能无法初始化" 你能告诉我我在这里做错了吗?
#include<stdio.h>
void initArray(int **a, int sz){
int i;
for (i = 0; i < sz; i++) {
a[i] = calloc (1, sizeof **a);
*a[i] = i;
}
}
int main(){
const int Var = 10;
int *array[Var] = {NULL};
initArray(array,3);
}
答案 0 :(得分:2)
由于历史原因,const
变量的值在C中从不被视为常量表达式。
因此,如果您将其用作数组维度,则该数组是可变长度数组,并且不允许可变长度数组具有初始值设定项。
尚未提及的一个解决方案是使用enum
。调查员实际上是不变的表达方式,他们不会受到相同的“更大的锤子”的影响。问题作为预处理器宏:
int main()
{
enum { Var = 10 };
int *array[Var] = {NULL};
initArray(array,3);
}
答案 1 :(得分:1)
C没有用户定义类型的符号常量。您遇到了与C ++的差异之一。
const
限定符只是保证你给编译器不会更改变量(!)Var
。
具有初始化和全局数组的数组需要常量表达,可以在编译时进行评估。由于Var
在语义上仍然是变量,因此无法使用它。
模拟符号常量的C方式是宏:
#define ARRAY_SIZE 10
...
// in your function:
int *array[ARRAY_SIZE] = ...
宏由预处理器处理,在实际编译器看到代码之前是文本替换。
注意我将名称更改为更加不言自明的名称。宏也应该在文件级别,通常在开头附近,以便更容易修改。在代码中直接使用整数常量 10
是一个坏主意。当需要修改时,这些幻数通常会导致错误。
答案 2 :(得分:-1)
该错误表明您无法在可变大小的对象上使用初始值设定项(= {NULL}
函数中的main
)。虽然看起来它不是变量的(因为const
上的Var
,并且因为10
是常量),但它将其视为变量,因为您通过变量访问它。如果您使用:
int *array[10] = {NULL}
我认为您的代码段可以正常使用。