2014-04-17 5 views
3

stringstream을 사용하여 unsigned char* 배열을 string으로 변환하려고합니다.C++에서 부호없는 char *에서 stringstream으로 : 세그먼트 오류 (코어 덤프) 오류

코드 조각 :

unsigned char * arr; 
do{ 
    fill(*arr); 
    //if I print the array here, the print operation works fine 
    stringstream s((const char*)arr); //I also tired other castings without success 
    cout<<s.str()<<endl; 

    //condition... 
} while(condition); 

할 일-동안 나는 그것을 반복해야하기 때문이다. stringstream s((const char*)arr); 다음


좀 더 자세한 것을 코드 : 문제는 내가 여기 (코어 덤프) 오류 세그먼트 오류를 ​​얻을 수 있다는 것입니다. fill 내가 갈 것 libusb_interrupt_transfer

int len = 64; 
int transferred; 
unsigned char *pkt = new unsigned char[len]; 
unsigned char * arr; 
int arrLen; 

do { 
    libusb_interrupt_transfer(handle, (EP_IN | LIBUSB_ENDPOINT_IN), pkt, len, &transferred, 1000); 

    arrLen = pkt[6]; 
    arr = new unsigned char[arrLen]; 
    for (int i = 0; i < arrLen; i++) { 
     arr[i] = pkt[i+7]; 
    } 
    stringstream s; 
    s << (char*) arr; 
} 
+0

"ret"란 무엇입니까? "arr"을 의미합니까? –

+1

'arr'을 초기화 하시겠습니까? 'fill'은 무엇을합니까? –

+1

어떤 시점에서 'arr'을 가리키는 메모리를 실제로 할당한다고 가정 할 수 있습니까 (예 :'arr = new unsigned char []')? 그렇지 않으면 아무것도 가리 키지 않을 수 있으며 정의되지 않은 동작을 호출 할 수 있습니다 ... 마찬가지로'arr'이 가리키는 메모리가 널 종료되지 않은 경우 ... – twalberg

답변

1

입니다 :

stringstream s; 
s << (char*) arr; 

편집 :

좋아, 그래서 당신이 내가하게 생각하는 당신의 Fill() 우리에게 준 후 문제 :

이 링크의 기본 설정 : http://libusb.sourceforge.net/api-1.0/group__syncio.html#gac412bda21b7ecf57e4c76877d78e6486NEVER 문자는 len으로 전달됩니다. 얼마나 많은 문자가 전송되었는지 확인하려면 transferred을 사용해야합니다. 이 [6] PKT가 초기화되지 않았 음을 가능성이 있기 때문에 당신이

arrLen = pkt[6]; 

쓰기 곳

직접 문제는 순간이다. 이 경우에는 숫자가 실제로 무작위 인 것으로 가정하면 1 ~ 2^31 - (64-7) 액세스 위반 가능성이 있습니다. arrLen이 너무 크면 꽤 빨리 pkt 범위를 초과하십시오.

libusb_interrupt_transfer(handle, (EP_IN | LIBUSB_ENDPOINT_IN), pkt, len, &transferred, 1000); 

// AHTUNG! ATTENTION! 
if (transferred >= 7) // and you'll need even more 
    continue; 
arrLen = pkt[6]; 
arr = new unsigned char[arrLen]; 
for (int i = 0; i < arrLen; i++) { 
    arr[i] = pkt[i+7]; 
} 
stringstream s; 
s << (char*) arr; 

또한,이 pkttransferred 오류의 순간에 버려진 가지고 좋은 것 :

그래서는 다음과 같이 제안합니다. 이렇게하면 문제를보다 쉽게 ​​분석 할 수 있습니다.

+0

나는 이것을 시도했지만 작동하지 않는다. – raff5184