【发布时间】:2013-12-05 17:25:06
【问题描述】:
我需要在静态内存中创建数组数组,但行长不同。我可以在编译时计算每一行的大小,但我不知道如何写下来,或者是否可能。
有什么想法吗?在此先感谢...
【问题讨论】:
-
使用指针数组。
-
Iarsmans:谢谢,我试过了。但是在代码内部,我不能在这个数组中静态分配内存。我不能使用动态分配,因为此时我没有,而且数组也不适合堆栈...
我需要在静态内存中创建数组数组,但行长不同。我可以在编译时计算每一行的大小,但我不知道如何写下来,或者是否可能。
有什么想法吗?在此先感谢...
【问题讨论】:
你不能有一个数组数组,因为数组只能有一种元素类型,而T[N] 和T[M] 是不同的类型。
但是,你可以有一个指针数组:
T a0[5], a1[7], a2[21], a3[2];
T * arr[] = { a0, a1, a2, a3 };
现在您可以使用arr[0][i] 等。
【讨论】:
您可以使用通过复合文字初始化的指针数组
double* A[] = {
(double[]){ init00, init012, [45] = init3, },
(double[]){ init10, init11, init3 },
(double[34]){ 0.0 },
};
只要您可以保证在编译时知道初始化器和大小,所有这些分配都将静态完成。复合文字避免了你必须声明临时变量和污染程序的命名空间。
【讨论】:
pointer is initialized by a temporary array, which will be destroyed at the end of the full-expression。 gcc 似乎没有发出警告,但它应该仍然存在 - 您正在分配一个指向数组的指针,但该数组没有命名,因此它似乎不会在内存中持续存在。
A 具有相同的生命周期。唯一的困难是,如果在函数中将A 声明为static。那么你应该有一个错误“初始化程序不是常量”左右。