2014-09-03 60 views
0

運行我的代碼時出現奇怪的內存損壞。它來自下面塊中的「cin」。有趣的是,for循環第一次運行。 momory腐敗發生在第二次迭代中(當i = 1時)。使用cin時的內存損壞>>

case 3: 
      { 
       // for(int i = 0; i < MAX_PLAYERS; i++) 
       for(int i = 0; i < 5; i++) 
       { 
        mavlink_param_value_t packet_vel, packet_pwr; 
        float vel_factor; 
        float power_factor; 

        strcpy(packet_vel.param_id, "GAME_VEL_FACTOR"); 
        strcpy(packet_pwr.param_id, "GAME_PWR_FACTOR"); 

        printf("Current index %d\n", i); 
        // cout << "\n" << "Enter Game Velocity Factor:"; 
        // cin >> packet_vel.param_value; 
        cout << "\n" << "Enter Game Power Factor:"; 
        cin >> power_factor; 

        printf("Assigning local variable to struct member\n"); 
        packet_pwr.param_value = power_factor; 

        printf("Packing current message\n"); 
        mavlink_msg_param_value_pack((uint8_t)i, 
               1, 
               &messages[i], 
               packet_vel.param_id, 
               packet_vel.param_value, 
               packet_vel.param_type, 
               1, 
               1); 
       } 

       *cont_mode = true; 
       break; 

以下是錯誤:

Enter message for player 0 
Current index 0 

Enter Game Power Factor:1 
Assigning local variable to struct member 
Packing current message 
Current index 1 

Enter Game Power Factor:2 
*** Error in `./send_mavlink_msgs': malloc(): memory corruption (fast): 0x0000000000ccf050 *** 
Aborted (core dumped) 

謝謝!

更新:

這裏是我正在創建 「信息」

mavlink_message_t *messages = (mavlink_message_t *)malloc(num_of_robots*sizeof(mavlink_global_position_int_t)); 

它的定義是發現here

+4

「內存損壞」幾乎總是應該被解讀爲「我試圖做你告訴我的內容,但內存已經損壞,我無法做到這一點。」這意味着'cin >>'不是錯誤,發生了_before_錯誤。由於'malloc'檢測到了腐敗,99%的時間意味着你意外地寫了一個動態分配數組的末尾。 – 2014-09-03 16:59:55

+0

您需要在這些'cout'中放置'endl'而不是'\ n',否則輸出緩衝將會給您錯誤發生的錯誤信息。 – 2014-09-03 17:00:55

+0

什麼是'messages'?請說明如何初始化該變量。 – 2014-09-03 17:05:50

回答

3
mavlink_message_t *messages = (mavlink_message_t *) 
    malloc(num_of_robots*sizeof(mavlink_global_position_int_t)); 

這也許應該是:

mavlink_message_t *messages = (mavlink_message_t *) 
    malloc(num_of_robots*sizeof(mavlink_message_t)); 

使用錯誤的sizeof參數將分配錯誤的空間量。這是一個嚴重的問題,如果mavlink_global_position_int_t小於mavlink_message_t(從我粗略的谷歌搜索,似乎是這樣)。


此外,我不熟悉的一切 「mavlink」 是,但是從here判斷:

typedef struct __mavlink_param_value_t 
{ 
int8_t param_id[15]; ///< Onboard parameter id 
float param_value; ///< Onboard parameter value 
uint16_t param_count; ///< Total number of onboard parameters 
uint16_t param_index; ///< Index of this onboard parameter 
} mavlink_param_value_t; 

param_id是一個15字節數組。如果在末尾計數'\0'終止符,則"GAME_VEL_FACTOR""GAME_PWR_FACTOR"都是16字節字符串。

+1

+1或者使用常見的替代方法'num_of_robots * sizeof(* messages)'來獲得大小,除非特意打開類型雙引號,否則這將起作用。很好的評估,順便說一句(毫不奇怪)。 – WhozCraig 2014-09-03 17:27:58

+0

謝謝!我不知道我以前的兩個案例如何處理這個錯誤。 – b1gtuna 2014-09-03 17:31:13