首页 > 解决方案 > 分配的不明原因丢弃 volatile 限定符

问题描述

我在结构中有一个指针字段,它指向结构实例的链表。

struct myStruct {
    some fields...
    struct list_objects * volatile list;
}

根据我的理解,我这样声明是为了告诉编译器指针可以从其他线程更改,所以不要缓存它。
不是什么list指向的内容会改变,而是指针会改变。(否则 volatile 必须是第一个关键字对吗?)

访问list受到互斥锁的保护,因此线程不会在写入该指针时发生冲突。

当我将此指针的地址读入指向指针的指针时出现问题。

struct list_objects **ptrToPtr = &myStructVariable->list;

我需要双指针来为这个变量分配另一个指针或遍历链表。

编译器发出“赋值丢弃 volatile 限定符”警告。我读到了这个警告,并认为我基本上理解了它,但我不明白它为什么会出现在这里。
这个变量的地址永远不会改变。内容是易变的,但不是该内容所在的位置。

我想我对这件事的理解很差。请帮我解决这个问题。

标签: c

解决方案


你是正确的,ptrToPtr不会改变(如果你没有对它进行分配),所以它不需要是易变的。但是,*ptrToPtr可能会改变,因为它是有效的myStructVariable->list

所以你的声明应该是struct list_objects * volatile * ptrToPtr = &myStructVariable->list;.


推荐阅读