从指针读取立方结构

时间:2011-09-19 18:21:12

标签: c++ cuda structure

我试图读取内容为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

Memory Dump结构

谢谢!

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