【发布时间】:2012-02-03 13:00:47
【问题描述】:
我对此有点困惑:
我的函数fillData(void* db) 应该传递一个指向结构tdpatientProfile 的指针,该结构包含在结构tdWAKDAllStateConfigure 中作为名为@987654324@ 的成员。我只有一个void 指针pData(这是一个tdWAKDAllStateConfigure 指针作为void* 传递),它是另一个结构Qtoken 的成员,所以我需要将void 指针转换为@987654331 @ 在我可以访问 patientProfile 之前。因为此时patientProfile 已经被取消引用,但我需要一个指向它的指针,所以我在开头添加了一个&。
&(((tdWAKDAllStateConfigure*)Qtoken.pData)->patientProfile)
这在理论上应该可行,但patientProfile 有一个成员字符指针name[50],应该使用strncpy 填充。在filldata 中,我将void 指针投射回我的strncpy 调用中。
strncpy(((tdPatientProfile*)db)->name, sourcestring, passedChars)
此时,我的代码崩溃了。我无法验证它是否正确转换,因为它们是 void 指针,所以我无法在调试器中查找它们,并且洞察力的内存视图不起作用,因为它运行在我连接的虚拟 ARM 平台上gdb/insight 来调试它。
经过 2 小时的测试和调试,我不明白。这里有人知道出了什么问题吗?
好的,更多代码,这不是公共代码,所以我会尽量减少它。
我有一个数据库线程,它调用一个应该从文件中读取值的函数。数据库线程有一个本地成员 Qtoken,其中包含一个 void 指针 pData,文件中的值应写入其中。数据库线程内部的函数调用是:
unified_read(dataID_PatientProfile,&(((tdWAKDAllStateConfigure*)Qtoken.pData)->patientProfile))
标题:
uint8_t unified_read(tdDataId datatype, void* db);
在统一读取中,我打开文件等并调用另一个函数,该函数应该将文件内的数据解析为;并将之前的字符复制到患者档案的字符名称[50] 中。解析函数的函数调用:
parseString(&ptr, ((tdPatientProfile*)db)->name, 50);
标题
uint8_t parseString(char** ptr, char* destination, size_t destinationSize)
在 parse 函数内部一切正常(ptr 需要是双指针,因为它需要增加,因为destinationSize 是正确的并且取消引用的ptr 也是如此),它会找到 ; 16 个字符后保存在passedChars 中。但是这个 strncpy 函数调用会破坏它并使我的代码崩溃:
strncpy(destination, *ptr, passedChars);
嗯,我应该补充一下:我在 2 周前遇到了这个问题,刚刚更改了代码,统一读取将指针传递给 tdWAKDAllStateConfigure 并自行取消引用患者配置文件。这工作得很好,但我的编码主管不想传递整个 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,它是一个 void 指针。这需要转换为 tdWAKDAllStateConfigure 指针,以便我可以获得指向它的成员 patientProfile(这是一个 tdPatientProfile)的指针。我的错在哪里?
【问题讨论】:
-
“字符指针
name[50]”是指char *name[50]吗? -
没有更多代码真的很难说。你只展示了两个代码片段,它们之间的关系并不清楚。
-
不,是字符名[50];在患者档案内。感谢提及
-
这些结构体的定义是什么?
标签: c pointers casting void-pointers