69,382
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
int main()
{
int a[3] = {0};
const int tmp = 0; /* const修饰tmp,tmp是放在静态数据区中.rodata中还是栈呢?
* 若在.rodata中,就是我们所说的常量了,不能更改,字符串常量就是在这
* 若在栈上,那说明可以修改的,但与const修饰有矛盾!
*/
a[3] = 10; /* 数组溢出赋值到数组的下个地址空间了 */
printf("tmp: %d\n", tmp); /* tmp值改变啦
* 说明tmp是在栈的,const的没能对他进行保护
*/
return 0;
}
/*
* 总结下:
* const这个修饰词只是告诉编译器这个变量不能被修改,如果在编译期间修改了变量,
* 编译器会发现错误,给出提示,
* 而在程序运行中通过其他方法修改了const修饰的变量,编译器是无能为力的
*
* 所以const的是给编译器看的,
* 字符串常量用const修饰时 const char *p = "Hello";
* 因为字符串常量是在.rodata(也可能.text)中,所以其本身就是不能被修改的,
* const修饰下是又让编译器来保护下。
*
*/