2015-10-13 156 views
-1

你好,我正在努力寻找解决方案我已经定义了以下3D结构数组。C中结构的三维数组

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)); 
    } 

我可以遍历数组打印的内容,但在修改一些元素后程序的某一点而言,我不再能够访问某些阵列中的结构中,我也得到一个segfault。任何帮助表示感谢,谢谢。

PD:我刚发现我已经定义错误我的结构......

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

只要我交换的两倍float类型是固定的段错误...仍在试图弄清楚为什么它是segfaulting

+2

你有没有尝试在valgrind中运行你的程序?也许你在搞乱你的指数。 – ypnos

+2

显示的代码看起来正确。问题必须在其他地方。 – deviantfan

+1

请发表[mcve] –

回答

0

考虑分配单个缓冲区(使用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)); 
      } 
     } 
    } 
} 

直接让forEachPoint用自定义功能callbakc遍历每个struct Point值。