请教C语言高手,C语言常量变量能通过地址去修改吗?
在c语言里,((char *)*(int *)0x02000000) = (char *)malloc(20) ;
理解为如下:
第一步:0x02000000看成一个很大的整数。
第二步:接着(int *)0x02000000 则变成了一个指向存储着整型数的地址空间的指针,该地址空间的首地址是0x02000000 。
第三步:*(int *)0x02000000 则是取第二步说的地址空间中的数据,该数是一个整数(具体不知道)。
第四步:(char *)*(int *)0x02000000 则是把第三步得出的整数用(char *)强制类型转换成一个指向存储着char类型字符的地址空间的指针,该空间的首地址是第三步取得的整数。
到第四步的时候,当前的该指针指向的初始首地址是第三步取得的整数,
然后 经过((char *)*(int *)0x02000000) = (char *)malloc(20) ;之后,
该指针重新被分配指向char类型的大小为20字节的空间,之后该指针指向该新空间的首地址。
另外你说的:
int a=0x6868;
char str[] = "hello";
((char *)a) = str;
就是把整数a强制类型转换成一个指向char类型的指针,该指针指向的初始地址为0x6868, 接着((char *)a) = str;说明该指针重新被赋值,赋值后就指向了
"hello"地址空间的首地址。
以上在c里是可以的。
但是在c++里已经不允许强制类型转换作为左值。
关于那句话,见一楼回答,很对
定义指针变量时已经分配了内存空间,只不过,这个空间只能存储地址,也只能以地址的方式访问变量,所以必须指明指针所指向的地址,如果不指明,指针中存储的是随机值,对它的访问可能会导致异常甚至系统崩溃,赋值为NULL,指向无权访问的内存区,导致异常退出.
至于"long *L;L='\0';"的正确,我也很纳闷,除非将'\0'解释为字符串.因为所有的括号扩起来的变量都被当作字符串常量,可以直接赋给字符串指针如:char *ch="haha";
针对问题2:我单步调试了VS2010,从反汇编的代码发现:通过 int *p=(int*)(&a);后确实a的地址和p的值是相同的,运行*p=20;后 a在内存中的值确实已经变成20了,但是 printf("【%d,%d】",a,*p);中a的值不是从内存中取的,由于const int a=10;VS2010已经进行了优化在编译的时候直接把用到a的地方用10代替了,这样问题2就可以理解了。
针对问题1:从问题2的解释我们可以推出在定义局部常变量的时候编译系统并没有限制改内存变量区为只读,也许这是为了提高编译效率,通过问题2的分析可以推出在 GCC下对局部常变量a的处理和VC2010不一样,GCC是从内存地址取数的。
问针对问题3: static const int a=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否则肯定捕获不到
请教C语言高手,C语言常量变量能通过地址去修改吗?
说明:编译时要求修改 VS2010-项目属性- C\/C++ - code generation - Enable c++ exceptions --Yes with SEH Exceptions (\/EHa) ,你可以直接在c\/C++的command line中自己填上 \/EHa否则肯定捕获不到
c语言中的常量和变量
整型常量,实型常量,字符常量。符号常量 #define PI 3.1416 2.2 变量 ●在程序的运行过程中,其值可以改变的量称为变量。●变量名(用标识符表示)、变量在内存中占据的存储单元、变量值三者关系。●C语言中变量:“先定义,后使用”。3.整型数据 整型变量的定义 格式:数据类型名 变量名表;...
C语言入门阶段:带你深入理解常量和变量
字符型变量也是整型类型,可以采用ASCII编码存储,转义字符用于无法直接输入的字符。ASCII码表定义了英文字母、数字、标点等字符的编码规则,广泛应用于计算机系统。通过学习,已经掌握了C语言中常量和变量的基本知识。如有遗漏,欢迎留言交流。
C语言的常量和变量都有什么用的?
在编程世界里,C语言如同一座城堡,常量与变量则是城堡中的守护者。变量,如同城堡中的钥匙,它可以在程序的运行过程中自由变换,如同字母或字符串,如int a,a在程序运行过程中能随心所欲地变化。比如,我们可以先将a设定为1,然后再次更改其值为2。而常量,则是城堡的基石,它在程序过程中始终保持不...
C语言基础丨(二)带你深入理解常量和变量
常量整型常量:C语言支持三种整数形式:十进制(如123,-456,0)、八进制(如0123,-011)和十六进制(如0x123,-0x12)。实型常量(浮点数):包括单精度(如2e3f,3.6d)和双精度(如3.84d,5.022e+23f),后缀F或f表示单精度,D或d表示双精度。字符常量:如'a','1',用单引号包围,...
从C语言基础到高级C语言(进制转换、常量和变量)
C语言文件的格式以.c结尾,程序的入口通常是由main函数控制。C语言的程序流程包括编写.c文件,将其编译为机器代码,然后执行机器代码。注释功能在C语言中用来解释代码,不会被编译进入程序。C语言的类型分为基本类型,如整型、字符型、浮点型,指针类型,结构类型以及空类型void。基本类型中包括整型、字符...
C语言中常量和常量表达式的区别是什么?
C语言中的常量与常量表达式与变量 在程序运行过程中,其值不能被改变的量,称为常量。整型常量:1,0,-1 实型常量:8.2,-3.55 字符常量:'a', 'c'。常量一般从其字面形式即可判断。这种常量为字面常量或直接常量。整型常量可分为:int, short int, long int, unsigned int, unsigned short...
C语言中如何输出各种常量?
C语言输出常量和输出变量是相同的。均可以用printf带各种格式符号执行输出。常用的类型包括:1 整型,int, 使用格式为%d;2 短整型,short, 使用格式为%h;3 长整型,long, 使用格式为%ld;4 字符型,char, 使用格式为%c;5 字符指针型,char *, 使用格式为%s;6 单精度浮点型,float, 使用格式为...
c语言学到技能高考程度
技能高考c语言要掌握到以下程度:熟练记忆C语言的基本知识,包括标识符、常量、变量、算术表达式、赋值表达式、复合赋值表达式、逗号表达式和++--运算符。要熟练记忆一些基本的输入、输出语句,包括printf函数、空语句、复合语句。要掌握c语言的程序结构,包括关系运算与逻辑运算,if语句,if的嵌套、条件表达式...
c语言常量合法规则
c语言常量合法规则1、法律分析:C语言中常量:直接常量和符号常量。直接常量是指直接用具体数据表达的一种形式,直接常量又分为整型常量、实型常量、字符常量和字符串常量;符号常量则是指用C语言标识符定义的常量。2、合法变量名:只能由数字,字符还有下划线组成。而且不能与数字开头。满足上述条件外,还...