[c语言字符指针变量]对于printf这个函数,有着一系列的格式符号 比如你说的%d %s 不同的格式,有着不同的参数类型要求 比如%s 要求对应参数必须是char *型的 你例子中的string就是这一类型 所以不...+阅读
全局变量&局部变量的内存分配和初始化时机
C/C++ code
int i= 3;
int main() {
int j= 5;
}
编译上述代码,生成a.exe文件。
以下过程属于基本但并不精确的描述,具体实现细节和系统相关:
当你运行a.exe时,由于程序只能在内存中运行,所以操作系统首先要把a.exe加载到内存中,OS会创建一个进程,这个进程独享4G(32位)的虚拟内存空间,这个虚拟内存空间在逻辑上被分为许多“段”。OS会把a.exe文件中的代码部分放到进程内存空间的代码段部分(也就是把a.exe文件中的代码段映射到进程空间的代码段),把a.exe文件中的数据段映射到进程空间的数据段,加载过程完成后,还要进行栈指针设置等一系列准备活动,这些活动都完成之后,才会跳转到代码段中的main函数入口,执行main函数体。
来看一下上面例子中的代码,int i = 3; 这句话定义了一个全局变量i,初始化为3,也就是分配一段内存空间,设置这段内存空间的值为3。而main函数体内int j = 5;也分配了一段内存空间,设置这段内存空间的值为5。两者有什么区别呢?
首先,i放在静态存储区,j放在栈区。
其次,i在加载的过程中,在进入main函数之前就已经完成了分配空间和初始化;而j是在加载完成后,在main函数中完成分配空间和初始化的。
具体过程大致如下:
编译器看到int i = 3这一句后,会生成一个符号 i,生成与这个符号i相关的一些信息,比如:
i - 4byte(size) - 0x80344545(起始地址) - 3(初始化值)
这些信息都保存在a.exe中,然后加载a.exe的时候,加载器读取这些信息,设置相应的内存空间(0x80344545开始的4字节)的值为3。在这之后才进入main函数。
相对的,编译器看到int j = 5这一句后,会生成一些代码,这些代码会分配j的空间,并初始化其值。运行a.exe的时候,在加载工作完成后(此时int i = 3已完成),跳转到代码段中的main函数入口,开始执行main函数体,也就是执行int j = 5这一句,通过执行这些代码来分配空间和初始化。
简而言之,全局数据在加载阶段便已经完成了内存分配和初始化,通过映射.exe文件中的数据段来完成。而局部数据是在main运行期间完成内存分配和初始化,通过执行(v.)代码来完成。
关于C语言课程
#include
main(){
int a,b,c,d;
char ch;
printf("请输入算术式如(5+9)并按回车结束 :");
scanf(&a&ch&b);
printf("请输入结果:");
scanf(&c);
if(ch=='+'){
d=a+b;
else if(ch=='-')
d=a-b;
else if(ch=='*')
d=a*b;
else if(ch=='/')
d=a/b;
else
printf("输入有误");
}
if(d==b)
printf("输入结果正确");
else
printf(输入答案错误);
}
C语言课程设计
{ int i,graphdriver,graphmode,size; void *buffer; graphdriver=DETECT; initgraph(&graphdriver,&graphmode,""); setbkcolor(BLUE); cleardevice(); setcolor(YELLOW); setlinestyle(0,0,1); setfillstyle(1,5); circle(100,200,30); floodfill(100,200,YELLOW); /* 填充圆 */ size=imagesize(69,169,131,231); /* 指定图像占字节数 */ buffer=malloc(size); /* 分配缓冲区(按字节数) */ getimage(69,169,131,231,buffer); /* 存图像 */ putimage(500,169,buffer,COPY_PUT); /* 重新复制 */ do{ for(i=0;i
以下为关联文档:
C语言指针变量问题p2是一个指针变量,p2只能指向某个类型变量的地址,p2=&p1的意思是将p2指向p1的地址,而p1的地址是指针的指针,而p2只是个指针变量,所以语法上是错误的。printf那里也不能改成*p2,因...
C语言中如何定义全局变量1、首先,我们可以在函数外面定义变量,就是全局变量。 2、局部变量可以与全局变量同样命名。 3、但是优先级是局部变量优先。 4、但是局部变量的生命周期是整个结构内。 5...
c语言的static与函数变量你在函数中定义static变量,在定义的时候须得给他赋值,而且在程序运行中,只有第一次调这个函数时你所赋的值才有效果,之后每次调此函数,都不会重新给他赋值了(例如staitc a = 10,下...
PHP静态全局变量和普通全局变量有什么区别以前在远标了解过全局变量与全局静态变量的区别: (a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。 (b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全...
求助: C语言局部变量在栈上分配的方式是怎么样的1 为什么你觉得会覆盖test0的内存呢? 2 一般情况下,栈是从上(高地址)往下增长的,如果你想弄明白栈的分配情况,先学会汇编, 再写个简单的程序,调试查看生成的汇编码,你应该知道怎么看...
C语言声明变量c语言int类型用两个字节16位存贮 只能存储-32768~32767 存储9位数可用long int 或浮点来存贮float、double 一、整型数说明 加上不同的修饰符, 整型数有以下几种类型; signed...
c语言变量声明#include <stdio.h> #include <stdlib.h> int main() { int val = 0;//提到前面来 char card_name[3]; puts("Enter the card_name: "); scanf("%2s",card_name);//用scanf if (ca...
c语言全局变量可声明问题如果static和extern都没有,表示定义一个全局变量,其作用域限制在从定义开始到当前文件结尾。 static的作用是将全局变量的作用域限制在从定义开始到当前文件结尾,且其他文件不...
求助C语言全局变量作用域求助C语言全局变量作用域,在C语言中什么是变量的作用域?什么是同名异值:这样理解 :第一个num 是全局变量,它在所有的程序中都存在, 子函数中的num 是形参 属于局部变量 它的作用域...