以下面C程序为例: #include <stdio.h> ; ; ; int c; int main(void) { ; char b[] = "Hello World"; register ; printf("Hello World%d\n", c); ; } 我们在全局作用域和main函数的局部作用域各定义了一些变量,并且引入一些新的关键字const, static, register来修饰变量,那么这些变量的存储空间是怎么分配的呢?我们编译之后用r…
为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hello.s -o hello.o $ ld hello.o -o hello 我们用gcc main.c -o main开编译一个c程序,其实际分为三个步骤:编译.汇编.链接 $ gcc -S main.c 生成汇编代码 $ gcc -c main.s 生成目标文件 $ gcc main.o 生成可执行文件 我们…
用反汇编的方法研究一下C语言的结构体: #include <stdio.h> int main(int argc, char ** argv) { struct { char a; short b; int c; char d; } s; s.a = ; s.b = ; s.c = ; s.d = ; printf("%u\n", sizeof(s)); ; } main函数中几条语句的反汇编结果如下:…
现在研究一下编译器优化会对生成的指令产生什么影响,在此基础上介绍C语言的volatile限定符.首先看下面的C程序: /* artificial device registers */ unsigned char recv; unsigned char send; /* memory buffer */ unsigned ]; int main(void) { buf[] = recv; buf[] = recv; buf[] = recv; send = ~buf[]; send = ~buf…
对于以下程序: int bar(int c, int d) { int e = c + d; return e; } int foo(int a, int b) { return bar(a, b); } int main(void) { foo(, ); ; } 在编译时加上-g选项,用objdump反汇编时可以把C代码和汇编代码穿插起来显示:…
分析以下代码中变量存储空间如何分配: //MemSeg.c: 代码无意义,仅供分析用 #include <stdio.h> #include <stdlib.h> //malloc函数声明位于<stdlib.h>或<cstdlib>头文件中 #include <string.h> #define LEN_TEST_INT 4 #define LEN_TEST_CHAR 20 }; int gBufInitNonZero[LEN_TEST_INT]…
1.基础研究 对如图程序进行编译连接,再用debug加载. 我们在偏移地址1fa处查看main函数的内容: 执行到1fd处,发现n的偏移地址为01a6,段地址存储在ds寄存器里,为07c4. 再查看函数f2: 参数a.b的值是用栈来传递的,它们的段地址都存放在ss寄存器中: 局部变量c的值在这里是用si寄存器存储的,因为c正好是int型,那么子函数里定义的局部变量是用寄存器存储吗?我们在这里加一条赋值语句看看会如何: 可见,局部变量d是放在栈里的,而c是放在寄存器si里的,只是函数要将c返回,就…
用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必须手写,在C语言中没有等价的语法,因为C语言的语法和概念是对各种平台的抽象,而各种平台特有的一些东西就不会在C语言中出现了,例如x86是端口I/O,而C语言就没有这个概念,所以in/out指令必须用汇编来写. C语言简洁易读,容易组织规模较大的代码,而汇编效率高,而且写一些特殊指令必须用汇编,为了把…
在c++中,指向类成员变量的指针存储的并不是该成员变量所在内存的地址,而仅仅是该成员变量在该类对象中相对于对象首地址的偏移量.因此,它必须绑定到某一个对象或者对象指针上面,这里的对象和对象指针,就相当于充当了this指针的容器. 下面先看c++源码以及输出结果: #include <iostream> #include <cstdio> using namespace std; class X { public: int _x; }; class Y { public: int _…
C语言中的变量大致可以分为全局变量,局部变量,堆变量和静态局部变量,这些不同的变量存储在不同的位置,有不同的生命周期.一般程序将内存分为数据段.代码段.栈段.堆段,这几类变量存储在不同的段中,造成了它们有不同的生命周期. 全局变量 全局变量的生命周期是整个程序的生命周期,随着程序的运行而存在,随着程序的结束而消亡,全局变量位于程序的数据段.每个应用程序有4GB的虚拟地址空间,在程序开始时系统将这个程序加载到内存中,为其分配内存,这个时候,会根据程序文件的内容,为全局变量分配内存,并为之进行初始化…
变量代表存储位置.每个变量都有一个类型,用于确定可以在变量中存储的值.C#是一种类型安全的语言,C#编译器保证存储在变量中的值始终是适当的类型.可以通过赋值或使用++和--运算符来更改变量的值. 必须明确赋值变量(定义赋值)才能获得其值. 如以下部分所述,变量最初分配或最初未分配.初始分配的变量具有明确定义的初始值,并始终被视为明确分配.最初未分配的变量没有初始值.对于要在某个位置明确赋值的初始未分配变量,必须在通向该位置的每个可能执行路径中进行对变量的赋值. 变量类别 C#定义了七类变量:静态…
<h4><strong>1.变量的存储类别</strong></h4>从变量值存在的角度来分,可以分为静态存储方式和动态存储方式.所谓静态存储方式指在程序运行期间由系统分配固定的存储空间的方式(<strong>程序开始执行时分配,在程序完毕时释放,在程序过程中它们占据国定的存储单元,而不是动态分配和释放</strong>).而动态存储方式在运行期间根据需要进行动态存储方式(<strong>在程序过程中申请和释放的一些空间&…
人们总说时间会改变一些,但实际上这一切还得你自己来. 一.概念详解 变量:计算机语言中储存计算结果,其值可以被修改.通过变量名来访问计算机中一段连续的内存空间. 属性:区别于同类事物的特征. C语言中变量的属性关键字有:auto register static extern 二.属性关键字详解 ①auto 用于修饰局部变量的默认属性修饰关键字,表明将自动变量表明存储在栈中. @note:auto只能修饰局部变量,修饰全局变量会报错. #include <stdio.h> auto ; //er…
上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一段代码(linux0.11的启动分析部分会在另一部分中再分析,由于此文仅涉及c与汇编代码的问题,). after_page_tables: pushl $ # These are the parameters to main :-) pushl $ pushl $ pushl $L6 # retur…
来自c程序设计 谭浩强 程序编译流程 运行c程序的步骤 在编好一个c程序后.怎样上机进行编译运行呢?一般要经过一下几个步骤: 上机输入和编辑源程序.通过键盘和计算机输入程序,如果发现有错误,要及时改正.最后将源程序以文件形式存放子啊自己制指定的文件夹内(如果不特别指定,一般存放在用户当前目录下),文件用.c作为后缀,生成源程序文件,如f.c. 对源程序文件进行编译,先用c编译系统提供的“预处理器”(又称“预处理程序”或“预编译器”)对程序中的预处理指令进行编译预处理.例如,对于#include<…
C语言中计算变量占用内存空间 在C语言中通常用[sizeof]运算符计算变量占内存空间,如下面的例子:…
[源码下载] 不可或缺 Windows Native (2) - C 语言: 常量,变量,基本数据类型 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 常量 变量 基本数据类型 示例cDataType.h #ifndef _MYHEAD_DATATYPE_ #define _MYHEAD_DATATYPE_ #ifdef __cplusplus extern "C" #endif char *demo_cDataType(); char *demo_co…
最近,在用keil 写一个小程序时,想实践一下从汇编调用 C语言函数,我们都知道C语言调用汇编函数讨论得较多,但反过来,从汇编中调用C语言的函数未见深入分析:在开始的时候,还是忽视了一个问题,就是对现场的保护和还原,以导于程序跑飞. 下面的一个小的测试用例,主要作用是:从C语言程序中调用一个用汇编写的名为int LEDFLASH(int a, int b).并从该汇编函数中,反过来调言用C语言实现的delay()延时程序.最后的结果是:由P2口控制的LED灯出现闪烁的现象.    C语言源程序所…
在从汇编看c++中指向成员变量的指针(一)中讨论的情形没有虚拟继承,下面来看看,当加入了虚拟继承的时候,指向成员变量的指针有什么变化. 下面是c++源码: #include <iostream> #include <cstdio> using namespace std; class Top { public: int _top; }; class Left : public virtual Top { public: int _left; }; class Right : pub…
C语言的指针变量 在C语言中,变量是固定范围的存储空间,它存储的是赋给他的值, 比如: ; /* 这里是定义一个整型变量a,并把12这个值存储在a的地址空间上 这个地址空间是系统随机分配的,对用户是透明的不用关心 */ 指针变量存储的是变量的地址, 比如: , *b; b = &a; /*如上,定义了一个整型变量a并赋值12,一个整型指针变量b 然后 用 & 取值运算符 取到变量a的地址空间值,存储到指针变量b中 此时变量b中存储的是变量a中的地址空间(这点尤其要注意,指针变量存储的是地址…
C 语言中的变量为什么不能以数字打头? C 语言中的变量为什么不能以数字打头? 不要告诉我编译原理书上有.我暂时看不懂. 除了下面的解释外, “假如变量名允许以数字开头的话,那么语法分析器在解析一个全部为数字的字串的时候,就无法判断它是一个数字常量还是一个变量名了” 还有别的解释吗? 假如变量是2n呢?也可以和数字2区别啊?为什么不行呢? C语言这样规定是不是单纯为了编译器词法分析简单啊?还有别的原因吗? 如果你知道就跟我好好说说吧. 没有规定就不成方圆,在最初的时候如果没有那么多的规定,这样基…
菜单导航 1.指针变量 2.指针和数组 3.常量指针和指向常量的指针 4.指针和字符串的关系 5.数组越界造成的访问不属于自己的内存空间现象 6.引用数据类型和基本数据类型,形参和实参 7.字符串和字符数组 8.字符串常用函数(长度.拷贝.追加.比较) 一.指针变量 /* 1.定义 普通变量: 数据类型 变量名称 指针变量: 数据类型 * 变量名称; 2.指针变量是什么类型,那么将来就只能保存什么类型变量的地址, 例如 指针变量是int类型, 那么将来就只能保存int类型变量的地址 3.* :…
操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 问题描述 C语言结构体定义中的变量默认是公有(Public)属性,如果实现成员变量的私有(Private)化? 解决方案 将结构体的定义放入源码件中实现,头文件只放声明. 比如有如下结构体(obj.h文件中定义): struct Obj { int id; char *name; }; typedef struct Obj Obj; 并定义如下变量: Obj *o; 正常情况下,可以通过如下代码正常访问结构体中的变量:…
Go语言基础之变量和常量 变量和常量是编程中必不可少的部分,也是很好理解的一部分. 标识符与关键字 标识符 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名.常量名.函数名等等. Go语言中标识符由字母数字和_(下划线)组成,并且只能以字母和_开头. 举几个例子:abc, _, _123, a123. 关键字 关键字是指编程语言中预先定义好的具有特殊含义的标识符. 关键字和保留字都不建议用作变量名. Go语言中有25个关键字: break default func interfac…
标识符与关键字 标识符 人为定义有特殊意义的词,Go语言中标识符由字母数字和_(下划线)组成,并且只能以字母和_开头. 关键字 关键字是指编程语言中预先定义好的具有特殊含义的标识符. GO语言中有25个关键字: break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import r…
局部变量.局部静态变量.全局变量.全局静态变量区别如下: 局部变量: 栈区: 局部静态变量:静态区: 全局变量: 静态区的常量区: 全局静态变量:静态区. 在进行C/C++编程时,需要程序员对内存的了解比较精准.经常需要操作的内存可分为以下几个类别: 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配…
事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结果依旧是正确的.经过半小时的反汇编调试.证明了我的猜想,如今在博客里分享.也是对C语言编译原理的一次加深理解. 引子: 首先我想以一道题目引例,比較能体现出问题. 例1: #include <stdio.h> /** 函数功能:用递归实现位运算加法 */ int Add_Recursion(int a,int b) { int carry_num = 0, add_num = 0; if (b…
一.变量的作用域和存储方式 在C语言中每个变量都有两种基本属性:数据类型.数据的存储类别. 数据类型很多人都已熟知,例如:字符型(char).整型(int).浮点型(float)等等.存储类别是指数据在内存中的存储方式,C语言中的存储类别共有4种:自动的(auto).静态的(static).寄存器的(register).外部的(extern).根据变量的存储类别,可以知道变量的作用域和生存期. 1.自动变量.关键字为auto,但实际上“auto”通常都可以省略,函数中的局部变量如果不用关键字st…
Go语言中的变量 通常用var关键声明变量,有常规方式和简化方式. 常规方式: var name1 type1 name1 = value1 //赋值 简化方式: var name2 = value1 //根据右边的值自动判断类型 更简便(偷懒)的写法是连var不要了,如: name3 := value3 go支持多变量声明: var name1, name2, name3 type name1, name2, name3 = value1, value2, value3 或者这样: name1…
1 概述 变量(Variable)是程序运行过程中,内容可以变化(修改)的量,变量的功能是存储用户的数据,是计算机语言中能储存计算结果或能表示值抽象概念.变量,是通过变量的标识符定位值的过程.变量的内存模拟演示: 2 定义:声明和初始化 定义变使用var关键字,需要指定其类型,可以同时初始化,如果没有指定初始化值,则使用类型的默认值,语法如下: // 声明变量,未初始化(默认值初始化) var name string // 声明变量,特定值初始化 var user string = "Hank&…