看以下代码:
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)动态数组 -------》堆