2014-10-16 1 views
-2
나는 다음과 같은 접근 방식에 대한 내 STRUCT를 변환 할

:어떻게 내 경우에는 힙 손상을 감지 할 수

  • 변환 STRUCT을 문자의 배열.
  • char의 테이블을 int 배열로 변환합니다.
  • int 배열을 char 배열로 변환합니다.
  • char 배열을 STRUCT로 변환합니다. 실행시

는하지만 그 erreur 있습니다 enter image description here enter image description here

이 내 코드입니다 : 당신이 날 실행하는 경우이 문제의 원인을 찾기 위해 기쁘게 도와 줄 수

void rServer::convertStruct_to_char (PCryptDATA p) { 

    // ***********convert struct to Array of char ************ 
    char* frame= new char[p.size]; 
    cout << p.size <<endl; 
    cout << endl; 
    memcpy(frame, &p, sizeof(p)); 


    //***********convert Array of char to array of int ************ 
    int taille= p.size; 
    int* out = new int[taille]; 
    for (int i=0; i<taille+1;i++) 
    { 
     out[i]=frame[i]; 
    } 

    delete [] frame; 

    //***********convert Array of int to Array of char ************ 
    char* int2char = new char[taille]; 
    for (int i=0; i<taille+1;i++) 
    { 
     int2char[i]=out[i]; 
    } 

    //delete [] int2char; 

    //***********convert Array of char to STRUCT ************ 
    PCryptDATA t; //Re-make the struct 
    memcpy(&t, int2char, sizeof(t)); 
} 

. 루프의 마지막 반복에서 당신이 out[taille]에 값을 할당하지만, out 배열 0 저점 taille-1에서 색인 taille 요소에 할당 된 -

+0

"out"과 "int2char"의 끝을지나 한 문자 씩 쓰고 있습니다 : 크기는'taille + 1'이거나 루프 바운드는'taille'이어야합니다. 또한,'p.size'와'sizeof (p) '사이에 혼란이 있습니다. –

+0

C++의 C 스타일 함수는 심각하게 frowned합니다. 당신은 STL과 iterator를 가지고 있습니다. 왜 손으로 루프를 작성하고 포인터로 놀고 있습니까? –

+0

또한'char'는 일반적으로 1 바이트이고'int'는 2 바이트입니다. int를 char 배열에 복사하면 데이터를 조작 할 수 있습니다. –

답변

0

int* out = new int[taille]; 
for (int i=0; i<taille+1;i++) 
    out[i]=... 

가 불량입니다. 결과적으로 할당 된 블록을 지나서 쓰고 힙의 다른 블록을 덮어 버리므로 손상시킬 수 있습니다.

은 다음과 같아야 다른 for 루프에 대한

int* out = new int[taille]; 
for (int i=0; i<taille;i++) 
    out[i]=... 

동일합니다.

+0

이 오류를 수정했지만 동일한 오류가 발생했습니다 – xtensa1408

+2

1 바이트의'char' 배열을 2 바이트'int' 배열로 복사하는 것이 더 나쁜 오류입니다. 데이터는 분명히 엉망이 될 것이고'int2char' 또한 버퍼의 끝을 오버런 할 것입니다. –

+0

@PanagiotisKanavos AFAIK'char'에서'int'로 복사 된 값은 부호 비트를 확장 할 수 있습니다 -하지만 적어도 8 개에는 영향을 미치지 않습니다 중요한 비트. 'char'에 카피하면 (자), 그 int 값은 간단히 잘라 버려, 소스 치가 복원됩니다. 너 무슨 말글 거리는거야? – CiaPan

관련 문제