我的函数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)的指针。我的错在哪里?
答案 0 :(得分:0)
这只是一个疯狂的猜测,但每当我看到strncpy()时,我都会感到紧张。我确信你知道strncpy()是邪恶的,因为它并不总是正确地终止目标字符串。这可能是你的问题吗?
您也可以考虑将strncpy的arg3设为sizeof(name)-1,或者无论如何比passChars更安全。
我愿意打赌这个问题与构建void *无关*:毕竟,这是 如果在演员表之后比较void *和char *,我想你会发现它们是逐位相同的。