c - C中的可变大小矩阵

标签 c dynamic size

有没有什么方法可以在 C(不是 C++,只是 C)中创建一个可变大小的双脚本数组?我知道要创建一个可变大小的单脚本数组,您只需使用一个指针,例如

float *array;
array = (float *) calloc(sizeof(float), n);

创建一个大小为 n 的单脚本 float 数组。我可以为双脚本数组做类似的事情吗?

最佳答案

C 中没有双脚本数组;只有数组的数组。例如。这个:

int a[3][3];

应读作“由 3 个整数组成的 3 个数组组成的数组”,而不是“由 3x3 整数组成的数组”。这可以从表达式类型中立即看出 - 例如a[0] 是一个有效的表达式,它的类型是int[3]

对于数组类型,数组大小是类型的一部分,因此必须在编译时知道。因此,虽然您可以使用“指向数组的指针”类型来使一维成为动态的,但其余的仍然必须是固定的:

int (*p)[3] // pointer to arrays of 3 ints each

有两种传统的解决方法:

  1. 只需使用 width x height 元素的一维动态数组,并根据 2D 坐标计算 1D 索引作为 (y * width + x) 你自己。

  2. 使用指向指针的指针:

    int** a = malloc(sizeof(int*) * height);
    for (i = 0; i < height; ++i) a[i] = malloc(sizeof(int) * width);
    a[0][0] = 123;
    ...
    

    这里的问题是您的数组不再需要是矩形的,您无法真正强制执行它。在性能方面,它也比单个连续内存块差。

在C99中,你也可以使用变长数组:

void foo(int width, int height) {
    int a[width][height];
    ...
}

关于c - C中的可变大小矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1651148/

相关文章:

c - c中的内联函数

c# - 下拉列表的上一项.text

objective-c - 使用 UIImageJPEGRepresentaion() 将 UIImage 转换为 NSData 并将其保存到文件会增加文件大小(以字节为单位)

c++ - C/C++远程消息队列的推荐

c++ - 使用 loadappinit_dlls 注册表项将 dll Hook 到正在运行的进程中

ios - 使用具有通用 setter 和 ARC 的 Objective-C 动态属性

c# - 如何将任何 C# 对象转换为 ExpandoObject?

C++ vector 库,为赋值重新创建,最大尺寸函数

ios - 如何在 iOS 中获取触摸大小?

c - 使用STM32和FreeRTOS时,“HAL_NVIC_SetPriority()”的有效值是什么?