2012-08-10 95 views
0

內我新的C++,需要一些幫助。 我有以下代碼:動態分配結構多張一個結構

struct Force { 
    float X[10]; 
    float Y[10]; 
    float Z[10]; 
}; 

struct Measurement{ 
    char serial_number[30]; 
    struct Force F1; 
    struct Force F2; 
}; 

我應如何合理分配以下?

struct Measurement meas 

問題是,結構強制力工作正常;然而,當我嘗試定義struct Measurement meas時,我得到「未處理的異常」錯誤!

+0

首先回答你的問題,如果你告訴我們,你_how_使用'meas'變量,當你得到了「撞車」更好。其次,當遇到「崩潰」時,你應該首先做的第一件事是在調試器中運行你的程序。它將幫助您找到崩潰的地點,並讓您檢查變量以幫助您瞭解崩潰的原因。 – 2012-08-10 06:41:58

+0

如果你說你在問題中學習C,你爲什麼要堅持把標籤改爲C++? – 2012-08-10 06:43:08

+0

這段代碼看起來不錯。 「動態分配」部分在哪裏? – 2012-08-10 06:43:36

回答

1

技術上講,它的工作原理是你寫的,但結構字是不必要的成員(實際上產生警告,但工程。)

struct Force { 
    float X[10]; 
    float Y[10]; 
    float Z[10]; 
}; 

struct Measurement { 
    char serial_number[30]; 
    Force F1; 
    Force F2; 
}; 

然後在功能使用這樣的:

Measurement somevar; 
somevar.F1.Y = 999; 

現在正確的方式做到這一點(和保存堆棧)是使用指針。

struct Measurement { 
    char serial_number[30]; 
    Force* F1; 
    Force* F2; 
}; 

然後:

delete m->F1; 
delete m->F2; 
delete m; 

還有一個辦法:

Measurement* m = new Measurement; 
if (m) { 
    m->F1 = new Force; 
    m->F2 = new Force; 
} 

使用,你必須刪除所有的指針,以避免內存泄漏後。使用:

struct Force { 
    float X[10]; 
    float Y[10]; 
    float Z[10]; 
}; 

struct Measurement { 
    char serial_number[30]; 
    Force F1; 
    Force F2; 
}; 

您可以使用malloc分配一定數量的內存並把它當作結構(沒有時間來測試它,但我用這種方法多次)。

Measurement* m = (Measurement*)malloc(sizeof(size in bytes of both structs)); 
// zero memory on m pointer 

// after use 
free(m); 

就這樣。所有這將有助於我們的

+0

謝謝。這適用於我(第一種方法)。我現在將詳細討論細節。謝謝大家。你幫了我很多! – jankos 2012-08-10 06:51:22

+0

您應該真正瞭解智能指針的概念,因此您不必親手「刪除」,因爲您可能會忘記它,或忘記正確地捕獲異常和清理。大多數現代的C++代碼不包含單個'delete'語句。 – BatchyX 2012-08-10 06:56:31

+0

感謝您對智能指針的建議。如果你能在上面的例子中告訴我使用智能指針,我會很高興。 – jankos 2012-08-10 07:05:29

0

C:

struct Measurement *meas; 
meas=(struct Measurement *) malloc(sizeof(Measurement)); 
      ^       ^      
       |        |     
       |        |     
      this is shape     this is the space allocated 

C++:

Measurement *meas; 
meas=new Measurement; 
+0

我可以發誓原來的q沒有動態的。你爲什麼使用malloc? – 2012-08-10 06:28:24

+0

malloc想要單個參數 – 2012-08-10 06:30:49

+0

哈哈,他將標記C更改爲C++,然後再更改爲C然後C++:D – 2012-08-10 06:31:23

2

正如我在你的問題所看到的,使用的是C,所以在這裏無論你想爲C.

解決方案結構測量的情況下,簡單地鍵入:

struct Measurement meas; 

,你將能夠訪問你的結構元素:

meas.F1.X and so on... 

,如果你想擁有動態分配(即。在運行時),然後只需使用malloc /釋放calloc如下

struct Measurement *meas = (struct Measurement *)malloc(sizeof(struct Measurement)); 

這樣做,你將有權訪問自己的結構元素:

meas->F1.X and so on...