c - C 中结构体的三维数组

标签 c arrays struct

您好,我正在努力寻找解决方案,我定义了以下 3D 结构数组。

typedef struct{
  float x;
  float y;
  float z;
} Point;

Point ***Qw;

Qw =  malloc(num_bezier * sizeof(Point **));
for(i=0; i<num_bezier; i++){
    Qw[i] =  malloc((m+1) * sizeof(Point *));

    for(j=0; j<=m;j++)
      Qw[i][j] = malloc((p+1) * sizeof(Point));
  }

我可以循环遍历数组来打印其内容,但在修改某些元素后,在程序的某个时刻,我无法再访问数组中的某些结构,并且出现段错误。感谢任何帮助,谢谢。

PD:我刚刚注意到我错误地定义了我的结构......

typedef struct{
 double x;
 double y;
 float z;
} Point;

一旦我将 double 类型替换为 float 类型,它就修复了段错误...仍在尝试找出为什么会出现段错误

最佳答案

考虑分配单个缓冲区(使用 pow( num_bezier, 3) 元素),而不是单独分配行、列和单元格。这样您可以避免过度分配,但也可以避免内存碎片。

struct Point { float x, y, z; }

size_t bufferLength;
size_t bufferSquareLength;
struct Point* buffer; // pointer to a dynamically-allocated cubic buffer of Point values, stored in row x, column y, and depth z order.

void allocateBuffer(size_t squareLength) {
    bufferSquareLength = squareLength;
    bufferLength = squareLength * squareLength * squareLength;
    buffer = calloc( bufferLength, sizeof(struct Point) );
}

struct Point* getElement(size_t x, size_t y, size_t z) {

    Point* p = buffer + ( x * bufferSquareLength * bufferSquareLength ) + ( y * bufferSquareLength ) + z;
    return p;
}

更简单、更容易遵循。

迭代每个值:

void forEachPoint( void(*callback(size_t x, size_t y, size_t z, struct Point* value) ) {
    for(size_t x = 0; x < bufferSquareLength; x++) {
        for(size_t y = 0; y < bufferSquareLength; y++) {
            for(size_t z = 0; z < bufferSquareLength; z++) {
                callback( x, y, z, getElement( x, y, z ) );
            }
        }
    }
}

只需使用自定义 callbakc 函数调用 forEachPoint 即可迭代每个 struct Point 值。

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

相关文章:

c - C中的双向链表

c - 收割丧尸? [C]

c++ - C 位标志枚举应如何转换为 C++?

arrays - numpy 数组相乘后如何有效求和?

C 错误 : Expected expression

c - 我的字符串没有进入它的 if 语句?

javascript - 添加重复的数组值

python - 将整数列表拆分为 bin,保留索引

Swift for 循环正在创建新对象

c++ - 在 C++ 中,定义一个非常简单的对象的最有效方法是什么