
关于c语言的几个问题。麻烦大家帮帮忙!谢了
对于局部变量应该在运行的时候才分配存储空间的对吧!可为什么对于数组,包括变量,书上都说要标明类型,大小,包括初始化。以便在编译的时候分配空间。这个不就与之前的矛盾了吗?是...
对于局部变量应该在运行的时候才分配存储空间的对吧!可为什么对于数组,包括变量,书上都说要标明类型,大小,包括初始化。以便在编译的时候分配空间。这个不就与之前的矛盾了吗?是不是只有主函数的变量是在编译时非配空间的?若不是请大家帮忙告诉我什么样的变量是在编译时分配空间,什么是在运行时分配空间
展开
5个回答
展开全部
想彻底明白这个问题需要一定的编译原理基础。
程序在编译完成以后,所有变量名都将被替换为内存地址。
函数内部的局部变量占用的内存是运行时堆栈,而函数自己会有一个代码内存区用来存放函数代码。函数代码包括CPU运行所需要的指令,比如判断,转向,运算等等。所有由主函数调用的函数,它们代码在主函数开始运行的时候就固定不变了。而函数所操作的数据,即函数内部的局部变量,它们的内存地址确是不固定的,因为运行时堆栈随时都在变化,每次运行某个函数,它内部的局部变量的地址都是不固定的。
但是由于函数代码区的数据是固定不变的,如何让固定的代码去操作内存地址不确定的变量呢,这里就引入了相对地址,即函数内部局部变量相对于函数堆栈起始位置的地址(函数堆栈起始位置的地址是由操作系统提供的),这样函数代码所操作的变量的地址就变成了,函数堆栈起始位置+相对地址(也叫偏移量),而这个相对地址是固定不变的。函数在不同时间运行,相对地址是不变的,变化的只是函数堆栈起始位置,但是这个起始位置,是由操作系统管理的,函数自己不用操心。
所以说,局部变量要在编译时分配空间,实际上是指,在编译时确定每个变量的相对地址(即偏移量),确定相对地址的前提就是局部变量必须已知类型,大小,否则编译无法通过。
程序在编译完成以后,所有变量名都将被替换为内存地址。
函数内部的局部变量占用的内存是运行时堆栈,而函数自己会有一个代码内存区用来存放函数代码。函数代码包括CPU运行所需要的指令,比如判断,转向,运算等等。所有由主函数调用的函数,它们代码在主函数开始运行的时候就固定不变了。而函数所操作的数据,即函数内部的局部变量,它们的内存地址确是不固定的,因为运行时堆栈随时都在变化,每次运行某个函数,它内部的局部变量的地址都是不固定的。
但是由于函数代码区的数据是固定不变的,如何让固定的代码去操作内存地址不确定的变量呢,这里就引入了相对地址,即函数内部局部变量相对于函数堆栈起始位置的地址(函数堆栈起始位置的地址是由操作系统提供的),这样函数代码所操作的变量的地址就变成了,函数堆栈起始位置+相对地址(也叫偏移量),而这个相对地址是固定不变的。函数在不同时间运行,相对地址是不变的,变化的只是函数堆栈起始位置,但是这个起始位置,是由操作系统管理的,函数自己不用操心。
所以说,局部变量要在编译时分配空间,实际上是指,在编译时确定每个变量的相对地址(即偏移量),确定相对地址的前提就是局部变量必须已知类型,大小,否则编译无法通过。
追问
那麻烦您看看我这样理解对吗?编译时说的分配空间是指分配相对地址,但这个变量的地址无确定值,只有运行时有确定值,而这个确定值就是指运行时才分配的空间?对吧、还有初始化也是这个意思是吧·
追答
“运行时”不是这个意思。
函数开始运行以后,局部变量可能不足以处理所有的数据,这时就会向操作系统请求额外的内存空间。而这个额外的空间的准确容量只有在程序开始运行以后才能获得,这个额外分配的空间就是“运行时分配内存”,它不使用运行时堆栈,而是内存池。比如,一个函数用来处理用户输入的数据,这个数据的大小在编译时是不可能知晓的,因为只有函数开始运行用户才会输入,所以处理这个数据的内存只能在函数开始运行时向操作系统请求,故曰:运行时分配地址,也叫动态分配。
展开全部
书上说的是对的。
局部变量在编译的时候就已经分配的存储空间,即使指针变量也如此,因为函数的等级是相同的,所以变量的空间分配也是一样的。
只有程序在运行中新申请的内存单元才是运行时分配的。比如使用malloc()、calloc()函数申请的地址单元。
局部变量在编译的时候就已经分配的存储空间,即使指针变量也如此,因为函数的等级是相同的,所以变量的空间分配也是一样的。
只有程序在运行中新申请的内存单元才是运行时分配的。比如使用malloc()、calloc()函数申请的地址单元。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
当没执行一个函数.程序都先要把一个函数用到的变量压栈..就是在你还没有执行到你的语句的时候函数已经压栈.如果你没分配空间.他压栈就不知道要分配多少空间..在此之前你函数里面的语句还没有运行.又怎么能手动非配空间.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
局部变量一般是在运行函数的时候分配内存空间,例如某函数void func(int a),其中的形参变量就是在运行函数的时候才分配内存空间。
全局变量是在编译阶段分配内存空间。
而宏定义 #define 和 头文件 都是在预编译阶段进行处理。
这是我记得的。
全局变量是在编译阶段分配内存空间。
而宏定义 #define 和 头文件 都是在预编译阶段进行处理。
这是我记得的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
变量有全局变量和局部变量,它们的作用域不一样,你可以参照一下相关教材。全局变量是在编译的时候分配空间,局部变量是在运行的时候分配空间。一般来讲,编译系统会将全局变量初始化为0,但局部变量则不然,里面存的是随机数,所以局部变化要用程序来初始化。变量的是以字节为单位进行存储的,不同类型的变量,所占用的字节长度也不一样,所以,每个变量都要指明其类型。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询