【问题标题】:Offset a pointer to a pointer with a count variable将指针偏移到具有计数变量的指针
【发布时间】:2018-04-04 05:55:34
【问题描述】:

所以目前我正在使用许多结构、指针和 malloc 函数。就目前而言,我有一个结构,在其他变量中,它包含一个指向使用 malloc 函数分配的一些内存空间的指针。

我使用这个空间来存储样本,因此我使用一个简单的计数变量来跟踪有多少样本。现在我的困难来自与我的 I2C 函数的接口,该函数使用三重指针 (signed char***) 来存储数据。

为了处理这个问题,我使用双指针(有符号字符**)指向结构中的指针提供的内存空间,然后我使用 count 变量来移动这个指针。

我发现添加的偏移量只是从保存初始指针的内存中递增。

我尝试实现这一点的代码行如下。

signed char** VAL_PTR = ((signed char**)(&mem.Accel.xBase)) + ((signed char) mem.Accel.SampleCount);

谁能看出我哪里出错了?任何帮助将不胜感激!

【问题讨论】:

  • "使用三重指针 (signed char***)" Three Star Programmer。实际上,您提供的单行代码看起来过于复杂。也许让自己熟悉严格的别名规则,无论如何,重新开始首先设计你的数据结构和程序流程,并以简单设计为目标。
  • 我们需要看到一个完整的(但最小的)示例,它显示了所有变量的类型,并解释了预期的结果是什么以及你得到了什么。用代码展示比用文字展示更好。

标签: c pointers


【解决方案1】:

如果xBase 是一个指针,那么指向xBase(即&xBase)的指针基本上等同于指向一个指针元素的数组的第一个元素的指针。在您的情况下,&xBase 基本上等同于 signed char *[1] 类型。

即它看起来像这样

+-------+ | xBase | +-------+ ^ | &xBase

现在,如果您还记得对于任何指针或数组p 和索引i,表达式*(p + i) 完全等于p[i]。如果我们用&xBaseSampleCount 替换,那么你所拥有的是*((&xBase) + SampleCount),它等于(&xBase)[SampleCount],它是one 元素数组的元素编号SampleCount + 1。它会超出范围。

上面添加的“图像”将类似于

+-------+ | xBase | ??? +-------+ ^ ^ | | &xBase &xBase + SampleCount

【讨论】:

  • 简而言之,我想我在问是否可以在将指针分配给指针时向 xBase 指向的地址添加偏移量?
  • @A.Derby 简而言之,没有。 &xBase + SampleCount 没有指向任何有效的地方。但是你可以做xBase + SampleCount 当然,它和&(xBase[SampleCount]) 一样(这意味着SampleCount 中的值需要一个有效的索引)。 然而转换似乎不正确,除非xBase指向的内存中的每个元素都是一个指针。
  • 啊,太棒了,这完全符合预期!我使用类型转换来允许指针兼容性。非常感谢!!
  • 只是为了增加一些额外的清晰度,我现在改变了我的方法。为了获得我需要写入样本的地址,我使用signed char* myPtr = mem.Accel.xBase + mem.Accel.SampleCount; 我认为我需要间接级别才能访问要写入的内存位置的地址。事实并非如此!之前的解决方案还有一个问题,我还没有完全弄清楚,但它确实与我也在使用的类型转换相对应。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 2020-09-12
相关资源
最近更新 更多