如何在运行时用 C 语言重新调整二维数组的形状? 例如,我们最初声明了一个 unsigned char 数组[20][500],稍后需要将其重新整形,例如:数组[40][250]。总内存消耗将(并且必须)始终保持不变(10.000 字节)。
限制是新形状的数组必须位于确切的内存空间地址上 - 正如最初声明的那样。我们无法分配不同的空间/我们不确定是否有任何可用空间可供使用(微处理器项目)。 我尝试使用 calloc,但最终它变得疯狂:
unsigned char **my_array; //Global defined
void reshape(unsigned short max_cols, unsigned short max_rows){
my_array = (unsigned char **) calloc(max_cols, sizeof(unsigned char*));
for(i = 0; i < max_cols; ++i){
my_array[i] = (unsigned char **) calloc(max_rows, sizeof(unsigned char));
}
}
我是 C 语言的新手,因此非常感谢您的帮助 - 谢谢!
最佳答案
数组 reshape 可以通过强制转换来完成:
char (*p)[FirstColumns] = calloc(FirstRows, sizeof *p);
// Test p and handle error if NULL.
char (*q)[SecondColumns] = (char (*)[SecondColumns]) p;
只要底层元素是相同类型,就不应该存在任何别名问题。
(迂腐的 C 解释可能会质疑,访问最初是 FirstColumns
数组、或其一部分、或重叠多个数组的 SecondColumns
数组是否违反了别名规则,但数组实际上并不是通过它们的左值访问的,因为它们的左值被转换为指针。我不知道有任何编译器会产生此类代码的问题。)
关于C - 在运行时 reshape 二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53998495/