访问从void指针转换的结构中的char指针

时间:2012-01-05 17:36:47

标签: c pointers casting void-pointers

我对此有点困惑:

我的函数fillData(void* db)应该传递一个结构tdpatientProfile的指针,它包含在结构tdWAKDAllStateConfigure中,作为名为patientProfile的成员。我只有void指针pData(这是tdWAKDAllStateConfigure指针传递为void*),它是另一个结构Qtoken的成员,所以我需要在我可以访问void之前,将tdWAKDAllStateConfigure指针转换为patientProfile。因为此时patientProfile已被解除引用但我需要指向它的指针,我在开头添加&

&(((tdWAKDAllStateConfigure*)Qtoken.pData)->patientProfile)

这应该在理论上有效但patientProfile有一个成员字符指针name[50],应该使用strncpy来填充。在filldata内,我将void指针投回到我的strncpy电话中。

strncpy(((tdPatientProfile*)db)->name, sourcestring, passedChars)

此时,我的代码崩溃了。我无法验证它是否被正确转换,因为它们是无效指针,因此我无法在调试器中查找它们并且洞察力的内存视图不起作用,因为它在我连接的虚拟ARM平台上运行gdb / insight来调试它。

经过2个小时的测试和调试后,我没有得到它。这里有人知道出了什么问题吗?

好的,更多的代码,这不是公共代码所以我会尝试将其减少到最少量。

我有一个数据库线程,它调用一个应该读取文件值的函数。数据库线程有一个本地成员Qtoken,它包含一个void指针pData,其中应该写入文件中的值。数据库线程内的函数调用是:

unified_read(dataID_PatientProfile,&(((tdWAKDAllStateConfigure*)Qtoken.pData)->patientProfile))

部首:

uint8_t unified_read(tdDataId datatype, void* db);

在unified_read中,我打开文件等并调用另一个应该将文件内的数据解析为a的函数;并将之前的字符复制到patientProfile的char name [50]中。函数调用解析函数:

parseString(&ptr, ((tdPatientProfile*)db)->name, 50);

标题

uint8_t parseString(char** ptr, char* destination, size_t destinationSize)

在解析函数内部一切正常(ptr需要是一个双指针,因为它需要增加,这可以起作用,因为destinationSize是正确的,并且取消引用的ptr也是如此),它会找到;在16个字符之后并将其保存在passChars中。但是这个strncpy函数调用会破坏它并使我的代码崩溃:

strncpy(destination, *ptr, passedChars);

啊,我应该补充一下:2周前我遇到了这个问题,只是更改了unified_read传递给tdWAKDAllStateConfigure指针的代码,并自行取消引用了PatientProfile。这工作得很好,但我的编码主管不希望传递整个tdWAKDAllStateConfigure只是为了更改其中的patientProfile成员。

另一项测试:

tdPatientProfile testomat;
char str1[]= "To be or not to be";
strncpy(testomat.name, str1, 15);

if(!unified_read(dataID_PatientProfile,&testomat))

这按预期工作。所以我的演员和(((tdWAKDAllStateConfigure *)Qtoken.pData) - > patientProfile)似乎是错误的。

记住:我得到了pData,这是一个无效指针。这需要转换为tdWAKDAllStateConfigure指针,以便我可以获得指向成员patientProfile(它是tdPatientProfile)的指针。我的错在哪里?

1 个答案:

答案 0 :(得分:0)

这只是一个疯狂的猜测,但每当我看到strncpy()时,我都会感到紧张。我确信你知道strncpy()是邪恶的,因为它并不总是正确地终止目标字符串。这可能是你的问题吗?

您也可以考虑将strncpy的arg3设为sizeof(name)-1,或者无论如何比passChars更安全。

我愿意打赌这个问题与构建void *无关*:毕竟,这是 如果在演员表之后比较void *和char *,我想你会发现它们是逐位相同的。