我希望p和atbl[1]打印相同的值(元素1的位置),但它不同

struct a {
    unsigned int  el[4];
};

struct a atbl[3] = {
  {0x12131415, 0x01030507, 0x01030507, 0x16171819},
  {0xa2a3a4a5, 0x02020202, 0x02020202, 0xa6a7a8a9},
  {0xb2c3d4e5, 0x02020202, 0x02020202, 0x0badcafe},
};

struct a * p;
// read address of element 1 in atbl
p = (atbl  + (1 * sizeof(struct a)));
printf("%08x %08x %08x %08x %08x\n", p, atbl, &atbl[0], &atbl[1], &atbl[2]);

但我得到了以下结果:
p-dae83240
atbl-dae83140
&atbl[0]-dae83140
&atbl[1]-dae83150
&atbl[2]-dae83160
有什么线索吗?

最佳答案

// read address of element 1 in atbl
p = (atbl  + (2 * sizeof(struct a)));

这应该是:
p = atbl + 1;

向已经指向第一个条目的内容添加一个将使其指向第二个条目所以加上两个将使它指向第三个条目。您希望它指向第二个条目,因此需要添加一个条目。
另外,您不必乘以大小,因为指针已经知道它指向的对象的大小。添加一个已经使它指向下一个对象。

关于c - 混淆数组元素地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21004168/

10-10 14:47