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

老王跟我说,他最近自己写了些代码,但不知道是为什么已经把数组声明成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(0, sizeof(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;
}
上面的代码输出是
但是C语言还有一个比较牛逼多东西,叫做类型强制转换,这个东西是太屌了,只有我知道地址了,我可以把这个地址转换成我想要的任意类型,我们在一些协议的格式收发上,结构体类型转换屡试不爽。
有了上面的东西后,那我就可以对地址类型转换,再改变地址里面存储内容的值了。
ok,上面的说完了。
诡异的是,我在我的macos上使用gcc竟然有个奇怪的问题
但是同样的代码,用另外的编译器是可以的,不过数组的值都是被改变了的。
评论
