有没有办法在C中创建一个可变大小的双脚本数组(不是C++,只是C)?我知道要创建一个可变大小的单脚本数组,你只需使用一个指针,例如
float *array;
array = (float *) calloc(sizeof(float), n);
Run Code Online (Sandbox Code Playgroud)
创建一个单一脚本的大小为n的浮点数组.是否有类似于我可以为双重脚本数组做的事情?
Pav*_*aev 10
C中没有双脚本数组; 只有数组数组.例如:
int a[3][3];
Run Code Online (Sandbox Code Playgroud)
应该读作"3个3个数组的数组",而不是"3个3个整数的数组".这可以从表达式的类型中立即看到 - 例如a[0],它是一个有效的表达式,其类型是int[3].
对于数组类型,数组大小是类型的一部分,因此必须在编译时知道.因此,虽然您可以使用"指向数组的指针"类型来使一个维度动态化,但仍需要修复其余维度:
int (*p)[3] // pointer to arrays of 3 ints each
Run Code Online (Sandbox Code Playgroud)
有两种传统的解决方法:
只需使用宽度为 x 高度的元素的单维动态数组,并从2D坐标中(y * width + x) 自己计算1D索引.
使用指针指针:
int** a = malloc(sizeof(int*) * height);
for (i = 0; i < height; ++i) a[i] = malloc(sizeof(int) * width);
a[0][0] = 123;
...
Run Code Online (Sandbox Code Playgroud)
这里的问题是你的数组不再是矩形,你不能真正强制执行它.在性能方面,它也比单个连续的内存块更糟糕.
在C99中,您还可以使用可变长度数组:
void foo(int width, int height) {
int a[width][height];
...
}
Run Code Online (Sandbox Code Playgroud)
你可以为多维数组做几乎相同的事情.
float **array;
array = calloc(sizeof(float*), n);
for(int i = 0; i < n; i++)
{
array[i] = calloc(sizeof(float), n);
}
Run Code Online (Sandbox Code Playgroud)