我有以下结构:
struct Datastore_T
{
Partition_Datastores_T cmtDatastores; // bytes 0 to 499
Partition_Datastores_T cdhDatastores; // bytes 500 to 999
Partition_Datastores_T gncDatastores; // bytes 1000 to 1499
Partition_Datastores_T inpDatastores; // bytes 1500 1999
Partition_Datastores_T outDatastores; // bytes 2000 to 2499
Partition_Datastores_T tmlDatastores; // bytes 2500 to 2999
Partition_Datastores_T sm_Datastores; // bytes 3000 to 3499
};
我想设置一个char *来指向这种类型的结构,如下所示:
struct Datastore_T datastores;
// Elided: datastores is initialized with data here
char* DatastoreStartAddr = (char*)&datastores;
memset(DatastoreStartAddr, 0, 3500);
我遇到的问题是,当DatastoreStartAddr指向已用数据初始化的结构时,它的值始终为零。
我做错了什么?
编辑:我的意思是零,即使我初始化结构后,结构中的“值”都是零。地址不为零,结构中的值为零。
编辑:我想我问的问题是错的。让我们重新开始。如果我有一个用数据初始化的结构,而另一个对象维护一个字段成员,该结构是指向该结构的指针,如果直接更改结构:
struct Datastore_T datastores;
char* DatastoreStartAddr = (char*)&datastores;
datastores.cmtDatastores.u16Region[0] = Scheduler.GetMinorFrameCount(); // byte 40,41
datastores.cmtDatastores.u16Region[1] = Scheduler.GetMajorFrameCount(); // byte 42,43
我不能使用DatastoreStartAddr指针访问这些更改吗?
编辑:以下代码尝试读取数据存储区中的数据集,但使用指向结构的指针:
CMT_UINT8_Tdef PayLoadBuffer[1500]= {NULL};
int TDIS = 0;
int DIS = 0;
int DSA = 0;
//copy DataStore info using address and size offsets
if ((PayLoadBuffer + TDIS + DIS) < IndvDEMMax)
{
memcpy((PayLoadBuffer + TDIS), Datastores+DSA, DIS);
TDIS += DIS;
}
在memcpy((PayLoadBuffer + TDIS), Datastores+DSA, DIS)
行中,数据存储区应指向结构并尝试访问该结构中的偏移量。但由于该值始终为零,因此它在PayLoadBuffer中复制零。
答案 0 :(得分:4)
我不知道你为什么得到一个零地址,但我猜你没有显示的代码与它有关。其他一些观点:
编辑: Bobby,回答您的补充问题 - 是的,您应该能够通过指针访问它,但不能通过char *
(不跳过一些箍)。你想要:
struct Datastore_T datastores;
struct Datastore_T * DatastoreStartAddr = &datastores;
当你使用那个指针时:
DatastoreStartAddr->cmtDatastores.u16Region[0] = Scheduler.GetMinorFrameCount();
请注意使用->
运算符。
答案 1 :(得分:0)
我刚刚测试了你的代码并且它不是零。尝试发布更大的片段
答案 2 :(得分:0)
你这样做的顺序错误 - 应该是这样的
struct Datastore_T datastores;
char* DatastoreStartAddr = (char*)&datastores;
memset(DatastoreStartAddr, 0, sizeof(Datastore_T));
// Elided: datastores is initialized with data here
现在数据存储仍处于初始化状态。就像其他人一样,你可能会想要这个
struct Datastore_T * DatastoreStartAddr = datastores;
memset((void *)DatastoreStartAddr, 0, sizeof(Datastore_T));
答案 3 :(得分:0)
我假设你没有展示的代码是正确的。向我们展示审查可能是明智之举。可能,我在下面说的根本不是问题。
由于播放,可能是您在此处遇到aliasing问题。如果你设置了积极的编译器优化标志(例如gcc上的-fno-strict-aliasing
),编译器会认为这两个指针永远不会引用相同的东西,因为它们有不同的类型。然后,其中一个或两个表示可能会缓存在不同的CPU寄存器中,因此对一个表示的更新永远不会反映在另一个中。
同样,这是一个很长的镜头。考虑到struct
的大小(当我开始回答你的重复问题时我没有看到它),它不太可能存在于主存储器中的任何其他位置。但您可以尝试拒绝编译器优化,看看它是否有所作为。
答案 4 :(得分:0)
您的结构值在什么时候为零?如果它在演员表和memset()
之前,则问题在于您的初始化。如果它在演员表和memset()
之后,则结构中的值为零,因为memset()
用0覆盖了您初始化它的值。 datastores
之后memset()
中的值也应为零。