2011-09-19 4 views
0

다음 형식을 가진 C++ 구조체 (윈도우에서)를 읽으려고합니다.포인터에서 큐빅 구조 읽기

typedef struct __cudaFatCudaBinaryRec { 
    unsigned long   magic; 
    unsigned long   version; 
    unsigned long   gpuInfoVersion; 
    char*     key; 
    char*     ident; 
    char*     usageMode; 
    __cudaFatPtxEntry    *ptx; 
    __cudaFatCubinEntry   *cubin; 
    __cudaFatDebugEntry   *debug; 
    void*     debugInfo; 
    unsigned int     flags; 
    __cudaFatSymbol    *exported; 
    __cudaFatSymbol    *imported; 
    struct __cudaFatCudaBinaryRec *dependends; 
    unsigned int     characteristic; 
    __cudaFatElfEntry    *elf; 
} __cudaFatCudaBinary; 

이 구조체 (void * ptr)에 대한 포인터가 있습니다.

이제 읽고 싶습니다. 이 구조의 내용

__cudaFatCudaBinary *ptr2=(cudaFatCudaBinary*)ptr; 
cout<<ptr->magic;//This works fine 
cout<<ptr->key;//This crashes my program..bad pointer results..why? 

위의 내용은 포인터가 아닌 모든 포인터 구성원과 일치합니다. 내가 뭘 잘못하고 있죠?

추가 :

문제를 자세히 설명하겠습니다. 예, "key"가 가리키는 주소는 NULL이므로 모든 포인터 구성원을위한 것입니다. 그러나 구조에 유효한 데이터가 있는지는 확실합니다. 핸들 함수를 생성하기 위해 드라이버 함수에서 사용하며 잘 실행됩니다. 필요한 것은 구조의 전체 이미지를 복사하여 텍스트 파일에 저장하는 것입니다. 나는 그것을 어떻게 할 것이냐? 일부 회원 필드가 null 인 이유는 무엇입니까? 구조의 주소 제한을 찾기 위해 무차별 방식으로 생각하고 있습니다. 그러나 가치 자체는 읽을 때 무효로 보입니다. 나는 그것에 대해 어떻게 해야할지 모르겠습니다!

구조 2

Memory Dump 추가

고마워요!

+0

'key' 필드의 값을 확인해 보셨습니까? 현재, 당신은'char * '를'cout'에 보내고, 그것이 유효하지 않은 포인터 (널 포인터)라면 프로그램이 충돌합니다. 아마도 포인터를 숫자 ('unsigned long'? my C is rusty ...)에 캐스트해야합니다. –

+0

'ptr'가 가리키는 객체의 내용을 보여줘야합니다. 아마'key'는 무엇이든 그리고 따라서 UB로 초기화되지 않을 것입니다. –

+0

printf ("포인터 값은 % p \ n", ptr-> key); –

답변

0

, 이것의 형식은 크게 구조체 변경되었습니다. magic의 값이 이제 다르며 gpuInfoVersion은 이제 실제 데이터가 들어있는 구조체에 대한 포인터입니다. 자세한 내용은 this thread을 참조하십시오.

1

cout << ptr->key 어떤 키 포인트 가든 0으로 끝나는 문자열로 인쇄됩니다. 이 아닌 포인터는입니다. 키가 NULL이거나 유효하지 않은 경우이 값은 정의되지 않은 동작입니다. 그냥 포인터를 인쇄하려면

하는 것은 그 자체가 당신이 void* 포인터로 인쇄해야합니다 (이 경우는 "충돌"에서) CUDA 4.0로

cout << static_cast<void*>(ptr->key); 
+0

내 생각에 비 초기화 된 포인터가 더 있습니다. –

+0

@Als 나는 그것이 "그렇지 않으면 무효하다"라고 생각했다. – Flexo

+1

OP가 관련 코드를 게시하지 않는 한 모든 추측이 작동하므로 신경 쓰지 않아도된다. –

관련 문제