C - 在运行时 reshape 二维数组

标签 c arrays

如何在运行时用 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/

相关文章:

在 C 中创建没有 pthread_join 的线程

c - 减少 malloc() 调用次数

java - 查找数组中最高值的索引(Java)

javascript - 使用带反引号和美元符号的 console.log() 打印变量

c - 如何在不使用库的情况下将整数数组转换为字符串

javascript - 获取匹配项和非匹配项的数组

c - 段错误: 11 & illegal character encoding in string literal

c - 双向链表 - 段错误 - C

c - 如何通读c中的文件列表

java - 如何从 Java IntStream 中的嵌套 .forEach 收集结果