数组存放在什么位置?

就简简单单定义一个数组
char a[100];
它是放在什么位置?栈里面?

老师留一个题,要先这样定义数组来接受字符串,然后用malloc堆开辟一块空间来把a数组里面的东西放到新开辟的地方,也就是堆空间;
请问这样做有意义吗?
堆很大?
放在堆里 易于程序执行?

求解

如果是定义在全局下的全局变量,这个数组就在数据段里。始终有效。

如果定义在函数下的局部变量,这个数组就在函数调用栈里。
用malloc申请堆空间拷贝数组内容,可能就是这个数组是在函数里定义的局部变量,函数调用结束后,栈里面为这个函数分配的空间就要失效,从而局部变量数组也会失效。但堆空间不会因为函数调用结束失效,函数调用结束后,函数里malloc出来内存空间仍然有效。
堆是系统管理的剩余内存,供系统运行过程中申请/释放内存空间,一般都比较大。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-10-13

数组是用于储存多个相同类型数据的集合。

在C语言中, 数组属于构造。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、、结构数组等各种类别。

一维数组在内存中的存放方式是:

1、硬盘上不可能运行程序的,必须在内存中运行。

2、低地址到高地址存储 。

3、数组元素通常也称为下标变量。

4、在C语言中,只能逐个地使用下标变量, 不能用一个语句输出整个数组。

5、int a[10]和t=a[6]分别是定义数组长度为10和引用a数组中序号为6的元素,6不代表数组长度。

本回答被网友采纳
第2个回答  2013-04-17
首先你要明白什么是堆,什么是栈。
栈是由编译器自己开辟的用来存放局部数据(局部变量,未显式初始化则为随机值),编译的时候不存在,运行的时候猜出现。
堆是由程序员开辟,堆是动态内存,也就是说知道程序员去释放它,否则它一直存在。
堆的大小:你开辟多大的空间,它就有多大。在c中是malloc,c++中是new。
最后一个问题,不是为了易于执行的,栈中的局部变量在使用完之后就释放掉了,即使这时候程序还没结束(例如局部函数中的变量,在出了“}”之后就释放了,释放之后就不能使用了)。而堆就不会释放,可以一直使用。追问

那老师让我们这么做没什么道理?难道只是让我们练习一下malloc?不会吧?
求解?

如果说没有free堆空间,那是不是进程结束了,那个开辟的位置还有数据呢?

追答

是让你们比较对比栈和堆的区别,这怎么没道理了?

程序结束,内存会被释放了。这是C++机制了好像。

如果存在句柄,并且还在被外部使用,那么程序结束了,这个句柄还是存在的。不会立即释放。

追问

谢谢你的回答,上次误操作没采纳你,原谅我吧~阿门。。。

追答

阿门。

第3个回答  2013-04-17
1、栈区(stack):又编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。

2、堆区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。

3、全局区(static):也叫静态数据内存空间,存储全局变量和静态变量,全局变量和静态变量的存储是放一块的,初始化的全局变量和静态变量放一块区域,没有初始化的在相邻的另一块区域,程序结束后由系统释放。

4、文字常量区:常量字符串就是放在这里,程序结束后由系统释放。
5、程序代码区:存放函数体的二进制代码。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网