数组在堆还是栈

这篇博客探讨了C++和C语言中数组的内存分配。通过代码示例,作者指出在函数内部声明的固定大小数组存储在栈上,函数结束时会被自动释放,导致数据丢失。使用`new`关键字创建的动态数组则存储在堆中,可以保持其生命周期。总结了不同情况下的数组内存位置:函数内的固定数组在栈,全局和类中的固定数组在堆,动态数组也在堆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看以下代码:

char *str(char ch[],int n)
{
	char temp[80] = {0};
	for (int i = 0; i < n; i++)
		temp[i] = ch[i];
	return temp;
}
char *arr1=new char[3];
arr1 = arr("hello", 3);

cout << arr1 << endl;

再调用后如下:
在这里插入图片描述在打入断点后,让刚执行完arr1 = arr(“hello”,3)
内存的值为“hel”,但明显红色值,说明有问题。
在这里插入图片描述
继续调试,值完全无效。
在这里插入图片描述
由此问题在于函数运行结束后,会自动释放函数中数组的值,像是临时变量。
静态数组在函数里声明是存放在中的,函数运行完毕,程序自动会释放
于是我将它改成用new,代码如下:

char * arr(const char ch[], int n)
{
	int i;
	char *t = new char[n + 1];
	for (i=0 ; i < n; i++)
		t[i] = ch[i];

	while (i <= n)
		t[i++] = '\0';
	
	cout << &t << endl;

	return t;
}

这样成功运行并得到我们期望的结果。
在这里插入图片描述
总结:
1)固定数组在函数体内声明------》栈
2)固定数组为全局变量-----》堆
3) 固定数组在类中声明------》堆
4)动态数组 -------》堆

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值