c - 如何使这个结构体实例在 C 中可变?

标签 c function struct volatile

我正在使用通用缓冲区 .c/.h 文件。我想创建一个符合 volatile 资格的实例,以用作 com 缓冲区。

下面的代码说明了问题,限定符丢失了??将缓冲区地址传递给成员函数时。

代码段使用“const”限定符作为示例,我假设“ volatile ”的行为方式相同。使用 Rowley ARM GCC 编译器。

typedef struct buff_t {
  char buffchar;
  int index;
  }buff;

void buff_init( buff *thisbuff ) {
  thisbuff->buffchar = 'x';
  thisbuff->index = 0;
  }


int main(void)
{

  buff memBuffer;
  buff const UARTBuffer;
  buff *buff_ptr;

  buff_ptr = &memBuffer;
  buff_init( buff_ptr );          /* struct elements initialized as expected */

  // UARTBuffer.buffchar = 'y';   /* this caught by compiler as error to read-only object */
  buff_ptr = &UARTBuffer;         /* compile warning: assignment discards 'const' qualifier from pointer target type */
  buff_init( buff_ptr );          /* UARTBuffer elements also initialized, expected const??? */

}

最佳答案

代码尝试通过指针修改const结构对象,从而调用未定义行为(UB)。简而言之,这是无效代码。避免这种情况的唯一方法是不要编写调用 UB 的代码。
请注意,编译器允许您编写此类代码并朝自己的脚(而不是脸上)开枪并不意味着您应该这样做。如果您有枪,那么您有责任明智地使用它。

要将变量标记为 volatile ,您只需在其声明期间添加关键字 volatile ,类似于程序中的const

关于c - 如何使这个结构体实例在 C 中可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10612068/

相关文章:

c - 嵌套结构数组

c++ - 简单的opencv相机程序中抛出异常

javascript - 如何在函数中处理时获取更新的值

c++ - 从匿名结构访问枚举条目

c# - 在 P/Invoke 中使用 ref struct 或 class

c++ - C++如何输出两组不同的随机数?

可以在模块初始化完成之前删除 Linux 内核模块吗?

c++ - 调试 "multiple definition of ..."错误的一般技巧?

c - 无法理解 void (*fptr)(void) 指针在 void 数组中的使用

php - 何时在 PHP 中使用类与函数