2014-09-03 3 views
0

Я получаю странное повреждение памяти при запуске моего кода. Это происходит из «cin» в следующем блоке. Забавно, что for-loop работает в первый раз. Моорное повреждение происходит на второй итерации (когда 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) 

Спасибо!

Update:

Вот как я создаю "сообщения"

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

Это определение найдено here

+4

«Повреждение памяти» почти всегда следует читать как «Я пытался сделать то, что вы мне сказали, но память уже была повреждена, и я не мог этого сделать». Это означает, что 'cin >>' не является ошибкой, что-то, что произошло _before_, то есть ошибка. Поскольку коррупция была обнаружена 'malloc', 99% времени, что означает, что вы случайно записались за конец динамически распределенного массива. –

+0

Вам нужно положить 'endl' вместо' \ n' в те 'cout', иначе буферизация вывода не даст вам неправильного представления о том, где происходит ошибка. –

+0

Что такое 'messages'? Пожалуйста, покажите, как вы инициализируете эту переменную. –

ответ

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 байт. "GAME_VEL_FACTOR" и "GAME_PWR_FACTOR" - это 16-байтовые строки, если вы считаете завершающие терминаторы .

+1

+1 или используйте обычную альтернативу, 'num_of_robots * sizeof (* messages)' для размера, который будет работать, если не будет запущен тип-punning. Хорошая оценка, кстати (не удивительно). – WhozCraig

+0

Спасибо! Я не знаю, как мои два предыдущих дела работали с этой ошибкой. – b1gtuna

Смежные вопросы