Ank*_*kur 16 c++ arrays volatile memset
volatile uint8_t reset_mask[768] = {0}
Run Code Online (Sandbox Code Playgroud)
现在我在一个内部操作期间将此数组元素的值设置为1.
在另一个函数调用中,我需要将此数组的所有元素设置为0.一种方法是使用for循环,但我相信更好的方法来分配数组的所有元素是使用memset
memset(reset_mask, 0, sizeof(reset_mask));
Run Code Online (Sandbox Code Playgroud)
但是我收到了这个错误: - "从类型'易失性uint8_t*{aka volatile unsigned char*}'转换为'void*'类型转换为限定符"
如果我们不能在这里使用memset,有没有更好的方法一次性设置这个volatile数组的所有元素?
你可以"使用" memset
抛弃volatile const_cast
,但它会删除volatile的语义.所以,除非你没问题,否则你会遇到循环版本.除非您的实现为您提供了一个memset版本,该版本需要使用volatile*并且已记录下来以完成您的工作.(我认为在嵌入式系统之外不太可能,即使在那里也会让我感到惊讶.)
正如Balog Pal所说,抛弃volatile
呼叫memset
破坏了volatile
语义。整体memset
可能会被优化,或者发生不确定的行为不良。
编写自己的循环以使数组归零,或使用以下方法memset_volatile
:
void memset_volatile(volatile void *s, char c, size_t n)
{
volatile char *p = s;
while (n-- > 0) {
*p++ = c;
}
}
Run Code Online (Sandbox Code Playgroud)
实数memset
也返回s
并且c
是int
,但此版本对我来说更干净。
尚不清楚是否允许编译器优化此函数一次写入多个字节,因此,如果数组很大,可能会有点慢。
编辑:由于C11有memset_s。由于某种原因,它并不需要指向volatile,因此您必须丢弃volatile。但是,可以保证实际覆盖内存。