Чтение структуры кубина из указателя - PullRequest
0 голосов
/ 19 сентября 2011

Я пытаюсь прочитать содержимое структуры 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?

Вышеуказанное согласуется со всеми не указателями и членами-указателями. Что я делаю не так?

ДОБАВЛЕНО:

Хорошо, позвольте мне подробнее остановиться на этой проблеме. Да, адрес, на который указывает «ключ», равен NULL, поэтому он относится ко всем элементам указателя. Но я точно знаю, что структура имеет действительные данные. Он используется функцией драйвера для генерации дескриптора и работает нормально. Все, что мне нужно, это скопировать все изображение структуры и сохранить его в текстовом файле. Как бы я это сделал? Почему некоторые поля-члены не имеют значения? Я думаю о грубой силе, чтобы найти адресные пределы структуры. Но сами значения кажутся недействительными при чтении, и я не знаю, как это сделать!

ДОБАВЛЕНО 2

Дамп памяти структуры

Спасибо!

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

cout << ptr->key будет печатать в виде строки с нулем в конце независимо от того, на что указывает клавиша, не сам указатель.Если ключ NULL или иным образом недействителен, это будет неопределенное поведение.(В данном случае «сбой»)

Если вы просто хотите напечатать сам указатель, убедитесь, что вы печатаете его как void* указатель:

cout << static_cast<void*>(ptr->key);
0 голосов
/ 20 сентября 2011

Начиная с CUDA 4.0, формат этой структуры сильно изменился.Значение magic теперь отличается, а gpuInfoVersion теперь является указателем на структуру, которая содержит фактические данные.Для получения дополнительной информации вы можете прочитать эту тему .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...