2016-05-20 9 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 o/p:Warum memset of array of structure das Programmverhalten verändert?

  1. pipename: myPipeName, PIPE: myPipeName
  2. pipename:, PIPE: myPipeName

Erwartet o/p:

  1. pipename: myPipeName, PIPE: myPipeName
  2. pipename: myPipeName, PIPE: myPipeName

Bitte lassen Sie mich wissen, wie kann ich dieses Problem lösen?

+4

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

+0

Danke. Heute habe ich meinen gesunden Menschenverstand verloren.Aber ich weiß nicht, warum ihr Leute abstimmt. –

Antwort

4

Sie sind dort aus gebundenen laufen, die undefined behavior

ändern

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

zu

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

oder, wenn Sie es vorziehen, die multipliziert Version (für eine bessere ruft Lesbarkeit, vielleicht?), verwenden Sie

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

oder

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

Das heißt, nicht initialisierten automatischen Variablenwert ist indeterministischen. Nicht versuchen, sie zu verwenden.

+1

multipliziert Version ist keine gute Idee. Wir müssen es beibehalten, wenn sich die Dimension von "res" ändert. – songyuanyao

+1

@songyuanyao Deshalb ist das eine zweite Wahl, aber trotzdem ist es möglich. –

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 

aus dem gebundenen Array zu schreiben ist nicht definiertes Verhalten, so ändern:

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

Sie eine falsche Größe Wert Einstellung

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

sein sollte

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

Wegen sizeof(res) geben Sie die Größe des Arrays in Byte zurück.

Oder

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

Wegen sizeof(Response) Rückkehr der Größe der Antwort typedef struct in Bytes.