我有一个字符数组队列,由名为data
的空指针指向,它保存了0x00008E80
的正确地址。
队列的尾部由一个简单的索引整数跟踪,在本例中它等于6
,即第 7 个数组位置。
我想返回一个指向尾部数组位置的指针,该位置应该是0x00008E86
。
我尝试了以下方法(及其一些变体),但没有成功:
struct queue_t {
void * data;
uint16_t tail;
};
char sqData[SQ_LENGTH] = {0};
struct queue_t sq = {0};
void initQueue (queue_t * q, void * d) {
q->data = d;
}
char * getTailPositionAddress (context_t sc) {
char * s = (char *)sc->slave->queue->data;
return (s + sc->slave->queue->tail);
}
void main (void) {
initQueue(&sq, sqData);
foo_context->slave->queue = &sq;
// queue is of type struct queue_t *
// Do some stuff that pushes data to the queue and then pops a bit of it
// so the tail is moved up to the 7th array position
char * bar = getTailPositionAddress(fooContext);
// Here bar is always equal to some stupid low address like 0x5 or 0x2!?!
}
为什么这不起作用?实现预期目标的正确方法是什么?谢谢!
最佳答案
发布的程序不允许查看 bar
最终得到什么值,即使使用调试器也是如此。编译器可以自由地重新安排内存写入,以便该值在计算后很长时间内仍存储在内存中。编译器甚至可以完全省略存储它,特别是在使用优化时。
为了能够检查 bar
的值,应将其声明为 volatile
或将其发送到文件。声明它 volatile
可以保证该值最终存储在内存中——不一定是在计算之后,而是在任何其他可观察事件发生之前。
关于c - 如何返回指向 void* 指向的数组中的数组位置的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25991833/