竟然改变不了const的值

共 2656字,需浏览 6分钟

 ·

2023-11-10 13:54




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





老王跟我说,他最近自己写了些代码,但不知道是为什么已经把数组声明成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竟然有个奇怪的问题













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















浏览 3274
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报