使用指向整数

时间:2016-04-07 23:43:03

标签: c arrays pointers

嘿,我正在处理一个问题,这就是我要做的事情: -

编写一个名为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);
 }

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}

我认为您的代码段可以正常使用。