/* 把 #if 0 改为#if 1, 可以看到什么是真正的不可写指针 */
#include <stdio.h>
int main()
{
#if 0
const char *p="hello"; // 这是一个真const 指针, 内容分配在不可写区域内, this is a real const char *, 你改变不了它的内容, 强改会崩溃的
#else
const char p[]="hello"; // 这是一个假const 指针, 在栈中分配的内存可以被改变, 怎么改变,强制转换
#endif
printf("before foo, p:%s\n",p);
((char *)p)[0]='a';
printf("after foo, p:%s\n",p);
return;
}
#include <stdio.h>
int main()
{
#if 0
const char *p="hello"; // 这是一个真const 指针, 内容分配在不可写区域内, this is a real const char *, 你改变不了它的内容, 强改会崩溃的
#else
const char p[]="hello"; // 这是一个假const 指针, 在栈中分配的内存可以被改变, 怎么改变,强制转换
#endif
printf("before foo, p:%s\n",p);
((char *)p)[0]='a';
printf("after foo, p:%s\n",p);
return;
}
const 修饰的变量,只是告诉gcc, 帮助照看一下,这个变量不可更改。gcc 会进行编译语法检查,仅此而已。
真正能否改变,要看变量分配的区域。