c - 分配的不明原因丢弃 volatile 限定符
问题描述
我在结构中有一个指针字段,它指向结构实例的链表。
struct myStruct {
some fields...
struct list_objects * volatile list;
}
根据我的理解,我这样声明是为了告诉编译器指针可以从其他线程更改,所以不要缓存它。
不是什么list
指向的内容会改变,而是指针会改变。(否则 volatile 必须是第一个关键字对吗?)
访问list
受到互斥锁的保护,因此线程不会在写入该指针时发生冲突。
当我将此指针的地址读入指向指针的指针时出现问题。
struct list_objects **ptrToPtr = &myStructVariable->list;
我需要双指针来为这个变量分配另一个指针或遍历链表。
编译器发出“赋值丢弃 volatile 限定符”警告。我读到了这个警告,并认为我基本上理解了它,但我不明白它为什么会出现在这里。
这个变量的地址永远不会改变。内容是易变的,但不是该内容所在的位置。
我想我对这件事的理解很差。请帮我解决这个问题。
解决方案
你是正确的,ptrToPtr
不会改变(如果你没有对它进行分配),所以它不需要是易变的。但是,*ptrToPtr
可能会改变,因为它是有效的myStructVariable->list
。
所以你的声明应该是struct list_objects * volatile * ptrToPtr = &myStructVariable->list;
.
推荐阅读
- sql - 左连接差异
- imagemagick - 如何使用 ImageMagick 删除图像的透明背景?我应该使用哪个函数来删除 CSS 透明度网格?
- react-native - 在 React 移动应用程序中动态更改页面标题
- python-3.x - python unittest 准备测试数据
- regex - C# 正则表达式替换字符串
- android - 在 Android Studio 中制作我喜欢大小的图像按钮的有效方法是什么?
- function - PHP函数作为正文错误:消息正文为空
- php - 在 HTTP cURL POST 中发送具有相同名称/键的多个值
- reactjs - React 有条件地禁用选择选项
- java - 在 GAE 上运行 Glassfish JAX-RS 服务器不起作用