c - C 中二维变长数组的结构

标签 c arrays dynamic-allocation

我正在尝试创建一个包含2个可变长度数组的结构(buffer_size是运行时获取的可变参数)。 这是我的代码:

struct data {
  float *c;   //2D array
  float *mtdt;  //1D array
};

struct data c_matrice;  
c_matrice.c = malloc((90 * sizeof (float*) * buffer_size)); 
c_matrice.mtdt = malloc(90 * sizeof (float*));

这个想法是将结构的成员链接到动态分配的数组。 这是编译器错误

expected « = », « , », « ; », « asm » or « __attribute__ » before « . » token
 c_matrice.c = malloc((90 * sizeof (float*) * buffer_size));

当我尝试访问这些成员时,我得到

subscripted value is neither array nor pointer nor vector

我在前面的问题中未能找到问题的解决方案。坦率地说,作为一个初学者,我并没有掌握一切。我错过了什么?

编辑1:好的,我通过将最后两行移动到我的 main.c 而不是 .h 文件中摆脱了第一个错误(这是一个基本的愚蠢错误)。现在我仍然面临着

subscripted value is neither array nor pointer nor vector

当我尝试使用类似的方法访问结构时

pmoy = pow(10,(c_matrice->c[i][curve2apply]/20))*pmax;

顺便说一句,整个代码真的很大,我向您展示的只是实际代码的一小部分。

最佳答案

您在这里所做的事情:

c_matrice.c = malloc((90 * sizeof (float*) * buffer_size)); 

分配一个大小为 90 * 浮点指针大小 * buffer_size 的长缓冲区。

如何在 C 中实现 2D 数组,您有很多选择。 一种方法是将您所拥有的内容更改为:

c_matrice.c = malloc((90 * sizeof (float) * buffer_size)); 

因此,您已经为 90*buffer_size float 分配了空间(而不是指向 float 的指针)。

然后您需要自己计算索引:

float get_matrix_element(struct data *c_matrix, size_t row, size_t column)  {      
    return c_matrix->c[row*buffer_size+column];
}

这是一种非常流行且非常有效的存储数据的方式,因为它存储为一个内存块,您可以执行有用的操作,例如将其分配在单个 block 中并迭代它,而无需关心结构:

float get_matrix_sum(struct data *c_matrix)  {      
    size_t sz=buffer_size*90;
    float sum=0.0f;
    for(size_t i=0;i<sz;++i){
       sum+=c_matrix->c[i];
    }
    return sum;
}

还有其他方法可以做到这一点,包括:

  1. 声明一个 90 长的一维指针数组,然后分配 float 行。

缺点是 91 个 malloc()/free() 操作,而不是 1 个。 好处是您可以分配具有不同长度行的不规则数组。

  • 声明一个静态(编译时)大小的数组 float c[90][buffer_size];
  • 其中buffer_size是编译时常量。 缺点是它的编译时间是固定的(如果很大并且局部变量可能会破坏堆栈)。 好处是管理内部 r*90+c 行计算不再需要您了。

    关于c - C 中二维变长数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43276985/

    相关文章:

    php - 将 db 值存储到 php 数组中,然后遍历数组

    arrays - 与数组相同的 'degree' 子数组的个数

    c - 小端结果

    Calloc 无法从不同的 .c 文件访问 -

    C++ 构造大型 shared_ptr vector 到类的有效方法

    c - 不明白为什么会出现段错误

    c - 编写用于编写 .matfiles 的 Matlab C API 的替代品

    c - 为什么我的指针消失了?

    我可以将输出操作数用作 ARM 内联汇编中的输入吗?

    c++ - 删除动态分配的变量设置指针为 0