2016-05-20 6 views
0
#include <stdio.h> 
#include <string.h> 
#define PIPE "myPipeName" 

typedef enum 
{ 
    ID1, 
    ID2 
}TEST_ID; 

typedef struct 
{ 
    double dCnt; 
    TEST_ID id ; 
}Response; 

int main() 
{ 
    char pipeName[256]=PIPE; 
    Response res[2]; 
    printf("1. pipeName : %s , PIPE : %s\n",pipeName,PIPE); 
    memset(res,0,2*sizeof(res)); 
    printf("2. pipeName : %s , PIPE : %s\n",pipeName,PIPE); 

    return 0; 
} 

Actual о/р:Почему memset массива структуры меняет поведение программы?

  1. pipeName: myPipeName, ТРУБЫ: myPipeName
  2. pipeName:, ТРУБЫ: myPipeName

Ожидаемое о/р:

  1. pipeName: myPipeName, ТРУБЫ: myPipeName
  2. pipeName: myPipeName, ТРУБЫ: myPipeName

Пожалуйста, дайте мне знать, как я могу решить эту проблему?

+4

'2 * sizeof (res)' ... hmmm .. –

+0

Спасибо. Сегодня я потерял свой здравый смысл.Но я не знаю, почему вы, ребята, проголосовали. –

ответ

4

Вы бежите из связанных там, что вызывает undefined behavior

Изменить

memset(res,0,2*sizeof(res)); 
       ^^^^^^^^^^^^ 

в

memset(res,0,sizeof(res)); 

или, если вы предпочитаете умножаются версии (для лучшего читаемость, возможно?), используйте

memset(res , 0 , 2 * sizeof(res[0])); 

или

memset(res , 0 , 2 * sizeof(Response)); 

Тем не менее, неинициализированная автоматическая переменная величина индетерминистская. Не используйте.

+1

умноженная версия - не очень хорошая идея. Мы должны поддерживать его, если размер 'res' изменился. – songyuanyao

+1

@songyuanyao Вот почему это выбор _second_, но, тем не менее, это возможно. –

1
Response res[2];//is an array of 2 Responses 

sizeof(res);//get the size of the array in bytes 

memset(res,0,2*sizeof(res));//the multiplication by the size of the array is not needed here and 
          //the memset is writing 0 out of bound of the array and probably 
          //into pipeName which would be treated as null terminator character 

Выписывая из массива, связанного это неопределенное поведение, так изменится:

memset(res,0,sizeof(res)); 
0

Вы устанавливаете неправильное значение размера

memset(res,0,2*sizeof(res)); 

Должно быть

memset(res,0,sizeof(res)); 

Из-за sizeof(res) возвращает размер массива в байтах .

Или

memset(res,0,2*sizeof(Response)); 

Из sizeof(Response) возвращения размера ответа ЬурейиХ структур в байтах.

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

  • Нет связанных вопросов^_^