竟然改变不了const的值

嵌入式Linux

共 2656字,需浏览 6分钟

 · 2023-11-10

老王是一个硬件工程师,而且老王是一个比较厉害的硬件工程师,平时会给我们发他的硬件作品,但是老王有一个写软件的梦想,梦想有一天写一些比较牛逼的软件代码,并以此来慰藉自己多年都没有买房的伤痛。

老王跟我说,他最近自己写了些代码,但不知道是为什么已经把数组声明成const了,运行之后,数组的值还是被改变了。
不多说,我只能上代码给他演示说明问题
    
    
#include "stdio.h"
#include "stdint.h"

void w_function(uint8_t page, uint8_t column, uint8_t reverse, uint8_t *dp) {
  uint8_t i, j, *data_temp;
  data_temp = dp;
  for(j = 0; j < column; j++) {
    *dp = (reverse == 1)? (~*dp) : (*dp);
    dp++;
  }
}

int main() {
  int i = 0;
  const uint8_t dp[8] = {1,2,3,4,5,6,7,8};
  const int a = 10;
  printf("Before: %d\n", a);

  int *p = (int *)&a; // 创建一个指向 const 变量 a 的指针,并强制类型转换为 int *
  *p = 20// 通过指针修改 const 变量 a 的值

  printf("After: %d\n", a);
  for (i = 0; i < sizeof(dp)/sizeof(dp[0]); i++)
    printf("%d\t", dp[i]);
  w_function(0sizeof(dp)/sizeof(dp[0]), 1, (uint8_t *)&dp);
  for (i = 0; i < sizeof(dp)/sizeof(dp[0]); i++)
    printf("%d\t", dp[i]);
  return 0;
}
    
    
上面的代码输出是

我们都知道const修饰的变量是不能改变它的值的,那也要说明那是在常的方法不行,但是可以用非常规的方法。

C语言有一个很明显的东西,地址需要有类型

但是C语言还有一个比较牛逼多东西,叫做类型强制转换,这个东西是太屌了,只有我知道地址了,我可以把这个地址转换成我想要的任意类型,我们在一些协议的格式收发上,结构体类型转换屡试不爽。

有了上面的东西后,那我就可以对地址类型转换,再改变地址里面存储内容的值了。

ok,上面的说完了。

诡异的是,我在我的macos上使用gcc竟然有个奇怪的问题


但是同样的代码,用另外的编译器是可以的,不过数组的值都是被改变了的。


浏览 3213
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报