㈠ 请教c语言高手,C语言常量变量能通过地址去修改吗
问针对问题3:staticconstinta=10;后a在常量区,该内存块不允许修改,如果修改系统会抛出异常,可改成下面代码,在VC2010下测试:
#include <stdio.h>
#include <stdlib.h>
int main()
{
static const int a=10;
int *p,b;
p=(int *)&a;
try
{
*p=20;
printf("try【%d,%d】",a,*p);
}
catch(...)
{
printf("catch【%d,%d】",a,*p);
}
system("pause");
return 0;
}
说明:编译时要求修改
VS2010-项目属性- C/C++ - code generation - Enable c++ exceptions --Yes with SEH Exceptions (/EHa),你可以直接在c/C++的command line中自己填上 /EHa否则肯定捕获不到
㈡ 全局变量为何是静态存储类型,它的值不能被改变吗
每个程序运行的时候,系统会为程序分配4个区(栈区、堆区、静态区、代码区),(对于c语言而言)。
栈区存放auto变量,也就是临时变量。堆区存放堆变量(也就是malloc的地址,手动分配内存的方式)。代码区存放你写的程序代码。而静态区存放的就是全局变量和常量的,(静态区也细分为全局区和常量区(在linux下))。
所以常量的存储方式为静态存储。这种层的东西国人也就是理解层面的,不深。
你可以自己查查有关内存四区的知识,或者看看嗨翻c这本书。
㈢ 哪些方法可修改常量存储区 pragma comment
#pragma comment (lib,"..\\Release\\gahsysmode.lib") 象这样就行了,这是在VC2010中测试的,因为是自己写的dll所以.lib文件在此文件夹
㈣ 常量存储区和静态存储区有什么区别 static const int a=10;是存到常量存储区还是静态存储区
如楼上所说,常量存储区里面的数据是放在代码段里的,不占内存。静态存储区是在内存空间中的,在其所属的类(或文件)中是全局的。
c语言中const好像没有用处。
static const int a=10;我个人认为是存到静态区的。你可以上网搜一下static const修饰的变量是如何赋初值的,一般有两种方法。一是定义时直接赋初值,二是类外赋初值。而常量是无法用这两种方法赋初值的。
㈤ 弱弱地问一下,是不是定义在函数之外的变量都是存储在静态全局区的,也就是不能修改的
变量的属性跟关键字有关,如const int a = 3;就是定义一个常量(不可更改的)可以在函数内部也可以在函数外部。定义在函数外面的是全局变量,即在当前源文件任何函数里面都可以使用,在多个文件中extern关键字申明也可以使用。变量的位置决定了它的有效范围,而修饰的关键字决定了它的属性,如static const volatile 等
㈥ eeprom存储器中的内容正常工作时可不可以改写
所谓EEPROM
就是电可擦除可编程只读存储器。
就EEPROM本身而言,正常工作时可以改写,是EEPROM
的基本功能。
但如果这个EEPROM中存储的是程序代码,且正在运行中,则有可能被CPU屏蔽掉擦写功能。
㈦ 静态存储区和常量存储区有什么区别
一、静态存储区和常量存储区的区别:
1、静态存储区,全局变量和静态变量被分配到同一块内存中;常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,是不允许修改的。
2、静态存储是main函数运行前分配内存并初始化;常量存储是固化在执行文件上的数据。栈的方向和平台有关,一般来说,windows由高地址向低地址增长,linux相反,但linux演变出来的操作系统不排除有特殊情况。
3、常量存储区里面的数据是放在代码段里的,不占内存。静态存储区是在内存空间中的,在其所属的类(或文件)中是全局的
二、静态存储区和常量存储区介绍
1、静态存储区:所有的静态对象,全局对象都于静态存储区分配,全局变量和静态变量被分配到同一块内存中,在以前的 C 语言中,全局变量又分为初始化的和未初始化的(初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被初始化的对象存储区可以通过 void* 来访问和操纵,程序结束后由系统自行释放),在 C++ 里面没有这个区分了,他们共同占用同一块内存区。
2、常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
三、注意事项:常量字符串都存放在静态存储区,返回的是常量字符串的首地址.
㈧ c++全局/静态存储区和常量存储区是一样的吗
当然不一样,下面详细讲解一下内存分配的几个区:
栈:
就是那些由编译器在需要的时候分配,
在不需要的时候自动清除的变量的存储区。
里面的变量通常是局部变量、函数参数等。
在一个进程中,位于用户虚拟地址空间顶部
的是用户栈,编译器用它来实现函数的调用。
和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。
堆:
就是那些由new分配的内存块,他们的释放编译器不去管,
由我们的应用程序去控制,一般一个new就要对应一个delete。
如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
堆可以动态地扩展和收缩。
自由存储区,
就是那些由malloc等分配的内存块,他和堆是十分相似的,
不过它是用free来结束自己的生命的。
全局/静态存储区,
全局变量和静态变量被分配到同一块内存中,
在以前的C语言中,全局变量又分为初始化的
和未初始化的(初始化的全局变量和静态变量在一块区域,
未初始化的全局变量与静态变量在相邻的另一块区域,
同时未被初始化的对象存储区可以通过void*来访问和操纵,
程序结束后由系统自行释放),在C++里面没有这个区分了,
他们共同占用同一块内存区。
常量存储区,
这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
㈨ 在c语言中,字符串作在全局区不可修改,那么在堆区可以修改吗
指针p最后指向的是常量区,内部不可被修改
将代码p = "asjwoep;sd'asd";改为strcpy(p,"asjwoep;sd'asd");
指针p依旧指向堆区,将内容赋值为字符串,后面的修改就是合法的
㈩ const常量可以在程序中改变其值。对不对
const是常量,其内容在代码段,该内容无法修改,赋值不能成功,有些数不希望能更改的,那么这些数最好不要声明为变量。。。对于PC无所谓,定义成变量无非就是不小心被改,悲剧了而已,const你赋值操作不会编译通过,也不会出现这种风险,理论上注意点就没问题。。。。。
但对于嵌入式芯片这一点const就很重要,没有const数据是在数据存储区,而对于嵌入式芯片很多数据存储区很小,不用const会带来额外开销。。。带const则数据在程序存储器ROM,这里通常很大,无所谓。。。不过C#毕竟不会用在嵌入式代码里,嵌入式开发一般用C语言,只是提一下const的优点。。。