【发布时间】:2019-11-07 00:34:33
【问题描述】:
我有一个全局易失性无符号字符数组volatile unsigned char buffer[10],数据在中断中写入其中。我有一个函数,它接受一个 unsigned char * 并将该值存储到硬件 (EEPROM) void storeArray(unsigned char *array),在这个例子中是前三个值。像这样将易失性数组转换为非易失性数组是否安全?
store_array((unsigned char *) buffer);
我阅读了以下内容,我不太明白,但我很担心:
6.7.3:5 如果尝试通过使用具有非 volatile 限定类型的左值来引用使用 volatile 限定类型定义的对象,则行为未定义。
这会影响我的代码吗?
然后我有这个后续问题:缓冲区数组只有我想要存储的一部分数据(无法更改),对于这个例子,从第三个值开始。这样做是否合法?
store_array((unsigned char *) buffer + 3);
如果是,如果将3 添加到数组中,演员表会受到怎样的影响? BR,谢谢!
编辑: @Cacahuete Frito 链接了一个非常相似的问题:Is `memcpy((void *)dest, src, n)` with a `volatile` array safe?
【问题讨论】:
-
IMO,因为无论如何这是特定于平台的代码,如果您可以确定
volatile在您的平台上执行您想要的操作,那么您可以使用它。无论如何,您都依赖于volatile的非便携方面,并且......一分钱,一磅。如果您的编译器对volatile的处理发生变化,您的代码无论如何都会中断。那么你有什么损失呢? -
关于
storeArray((unsigned char *) buffer + 3);:函数如何知道数组在哪里结束?如果它具有硬编码的大小,则指针算法可能会强制函数读取超出缓冲区限制的 3 个字节,因此是 UB。 -
@DavidSchwartz 这个问题的重点是为了更好地理解这个问题。不过我喜欢你的观点!我想我可以确定行为,因为代码非常严格。这可能是“最薄”的方式。 TY
-
volatile的含义另见electronics.stackexchange.com/q/409545/6383
标签: c arrays type-conversion volatile