设置指向结构的指针

时间:2010-03-30 13:05:17

标签: c++

我有以下结构:

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中复制零。

5 个答案:

答案 0 :(得分:4)

我不知道你为什么得到一个零地址,但我猜你没有显示的代码与它有关。其他一些观点:

  • 考虑在struct
  • 中使用Partition_Datastores_T数组
  • 不要使用魔术数字作为结构大小,你需要sizeof(Datastore_T)
  • 不需要中间字符*

编辑: 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()中的值也应为零。