2015-10-13 98 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值。