我试图读取内容为c ++结构(在windows中),其格式如下
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,因此它适用于所有指针成员。但我确信该结构具有有效数据。它由驱动程序函数用于生成句柄并且执行正常。我只需要复制结构的整个图像并将其存储在文本文件中。我该怎么办?为什么某些成员字段为空?我正在考虑一种蛮力的方法来找到结构的地址限制。但是阅读时价值观本身似乎无效,我不知道如何去做!
已添加2
谢谢!
答案 0 :(得分:1)
cout << ptr->key
将打印为0终止字符串,无论关键点是什么,不指针本身。如果key为NULL
或其他无效,那么这将是未定义的行为。 (在这种情况下是“崩溃”)
如果您只想打印指针本身,请确保将其打印为void*
指针:
cout << static_cast<void*>(ptr->key);
答案 1 :(得分:0)
从CUDA 4.0开始,此结构的格式发生了巨大变化。 magic
的值现在不同,gpuInfoVersion
现在是指向包含实际数据的结构的指针。有关详细信息,您可能需要阅读this thread。