有谁知道为什么这个数组初始化语句不起作用?

时间:2014-10-13 01:49:01

标签: c

我目前正在完成这段代码,并且我意识到当我给大小一个包含数字的变量等时,我的数组初始化不起作用。它只适用于我在其中放入一个实际数字。为什么会这样?

例如:

不起作用:

unsigned int width = 5;
unsigned int height = 4;
const uint8_t img[width*height]={0,1,2,3,4,5,6,8,7,9,6,2,1,1,2,5,3,8,6}; // why not?

使用:

unsigned int width = 5;
unsigned int height = 4;
const uint8_t img[20]={0,1,2,3,4,5,6,8,7,9,6,2,1,1,2,5,3,8,6}; //manually placing 20

是否有理由说第一个不起作用?

我计划用户输入宽度和高度,所以第一个应该工作但不起作用对我来说非常重要。

3 个答案:

答案 0 :(得分:1)

使用时,

unsigned int width = 5;
unsigned int height = 4;
const uint8_t img[width*height] = {.......};

img被视为可变长度数组。

使用时

unsigned int width = 5;
unsigned int height = 4;
const uint8_t img[20] = {.......};

img被视为已知大小的数组。

C99标准草案(N1570)禁止初始化可变长度数组。

  

6.7.9初始化

     

2要初始化的实体的类型应为未知大小或完整的数组   不是可变长度数组类型的对象类型

答案 1 :(得分:0)

这是由于初始化。您不能使用变量来声明初始化参数。声明阵列&在单独的行中初始化它。

uint8_t img[width*height];
for(i=0;i<(width*height);i++)
    img[i]=?

你将无法使它成为常量。否则,省略大小:

const uint8_t img[]={0,1,2,3,4,5,6,8,7,9,6,2,1,1,2,5,3,8,6};

数组将根据初始值自动分配大小。

答案 2 :(得分:-1)

好吧,我被否定了,我不喜欢这样......我假设它是因为我在某处错了,可能是因为我对C / C ++ const的确切理解数组中的用处。

Lemme尝试并且更有用。如果有人对此发表评论,请先让我自己纠正。我记得在数组初始化中可以使用 const 值,但不能使用非const值,因为它们被认为是变量数组。只要变量作为参数传递并且数组初始化为该值,就可以在C99中使用变量数组。如果我错了,我想澄清一下。

我看到的有趣的事情是,在使用两个变量,将它们相乘,然后将这些值设置为数组时,似乎没有太多的目的,除非宽度和高度值不是't&t; t在编译期间已知。如果是这种情况,那么初始化程序将不适合数组。如果是,只需使用空数组初始化并让编译器解决它。

工作:

const uint8_t img[] = {...};

断裂:

unsigned int someNum = 20;
const uint8_t img[someNum] = {...};

如果您需要可变长度数组,只需使用calloc()

unsigned int someNum = 20; // Or get this value from anywhere really.
uint8_t * const img = calloc(someNum, sizeof(unit8_t));

calloc()具有将所有值初始化为0的优势。如果您不想要,可以使用malloc()代替。请注意第二个示例中const的位置,如果您将其设为 const uint8_t * ,则数组中的将为const,而不是指向数组。如果希望数组值为const,只需将分配的数组作为const uint8_t数组返回。您还需要使用此策略清理阵列。