我目前正在完成这段代码,并且我意识到当我给大小一个包含数字的变量等时,我的数组初始化不起作用。它只适用于我在其中放入一个实际数字。为什么会这样?
例如:
不起作用:
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
是否有理由说第一个不起作用?
我计划用户输入宽度和高度,所以第一个应该工作但不起作用对我来说非常重要。
答案 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数组返回。您还需要使用此策略清理阵列。