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

标签 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!?!
}

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

最佳答案

发布的程序不允许查看 bar 最终得到什么值,即使使用调试器也是如此。编译器可以自由地重新安排内存写入,以便该值在计算后很长时间内仍存储在内存中。编译器甚至可以完全省略存储它,特别是在使用优化时。

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

关于c - 如何返回指向 void* 指向的数组中的数组位置的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25991833/

相关文章:

c - LIBUSB_ERROR_TIMEOUT 当我尝试使用 libusb raspberry pi 3 发送 usb 数据时

char数组到C中的LPCTSTR转换

arrays - 数组包含太慢的 Swift

c++ - 删除句柄类中的对象可能会导致未定义的行为

c++ - 从文件中读取值并使用类

c++ - 取消引用指针到指针

c - 更改值时出现段错误,但在打印时不会出现段错误

c - 生成数组中的随机数并计算平均值、最大值、最小值、总和

c - C 中的 Jenkins 散列,大小不是 4 的倍数的键和地址 sanitizer

java - 将自定义对象数组传递给 android 中的另一个 Activity