gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:03:03 26 4
gpt4 key购买 nike

我对此有点困惑:

我的函数 fillData(void* db) 应传递一个指向结构 tdPatentProfile 的指针,该结构包含在结构 tdWAKDAllStateConfigure 中,如下所示名为 patentProfile 的成员。我只有一个 void 指针 pData (这是一个作为 void* 传递的 tdWAKDAllStateConfigure 指针),它是另一个结构体 Qtoken 的成员,因此我需要将 void 指针强制转换为 tdWAKDAllStateConfigure,然后才能访问 patentProfile。因为此时 patentProfile 已经取消引用,但我需要一个指向它的指针,所以我在开头添加了一个 &

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

这在理论上应该有效,但 patentProfile 有一个成员 char 指针 name[50],应该使用 strncpy 填充。在 filldata 内,我将 void 指针转换回我的 strncpy 调用中。

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

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

经过 2 个小时的测试和调试,我还是没有明白。这里有人知道出了什么问题吗?

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

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

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

标题:

uint8_t unified_read(tdDataId datatype, void* db);

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

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

标题

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

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

strncpy(destination, *ptr, passedChars);

嗯,我应该补充一下:两周前我遇到了这个问题,只是更改了 unity_read 传递指向 tdWAKDAllStateConfigure 的指针并自行取消引用病人配置文件的代码。这工作得很好,但我的编码主管不想传递整个 tdWAKDAllStateConfigure 只是为了更改其中的病人配置文件成员。

另一个测试:

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)的指针。我的错在哪里?

最佳答案

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

您可能还需要考虑将 strncpy 的 arg3 设置为 sizeof(name)-1,或者无论如何比 PassedChars 更安全的值。

我敢打赌,这个问题与强制转换 void* 无关:毕竟,这就是 void* 的用途——保存指向任何类型的指针。如果比较转换后的 void* 和 char*,我想您会发现它们是逐位相同的。

关于c - 访问从 void 指针转换的结构中的 char 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8746988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com