如何返回指向void *指向的数组中数组位置的指针?

时间:2014-09-23 09:43:09

标签: c arrays pointers void-pointers

我的队列是一个字符数组,由一个名为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!?!
}

为什么这不起作用?实现目标的正确方法是什么?谢谢!

1 个答案:

答案 0 :(得分:1)

即使使用调试器,发布的程序也不允许查看最终得到的值bar。编译器可以自由地重新排列存储器写入,使得该值在计算之后很久就存储在存储器中。编译器甚至可以完全存储它,尤其是在使用优化时。

为了能够检查bar的值,它应该声明为volatile或发送到文件。声明它volatile保证值将被存储在内存中最终 - 不一定在它被计算之后,但在任何其他可观察事件发生之前。