分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。
#include < cstdio >
char * get_str()
{
char * str = { " abcd " }; // 可以
// char str[] = {"abcd"}; // 错误,结果不确定
return str;
}
int main()
{
char * p = get_str();
printf( " %s " , p);
return 0 ;
}
char *str = {"abcd"};//可以,是因为"abcd"是一个字符串常量,它并不在一个栈空间上,而是在静态存储区上。
字符串的生命周期是:程序开始时分配,程序结束时释放。
(当然,str是一个指针变量,在栈空间上,因此函数返回时会释放,但是所指为字符串常量,字符串常量所占空间在函数返回时不会释放)
而char str[] = {"abcd"};//错误,结果不确定,虽然从编译器的实现来看(见如下代码(VC6下)的结果),"abcd"仍然是当成一个字符串常量,但是程序又把它复制了一次,放在了栈空间上,返回的时候str所指的是栈上的这一块字符串。问题的本质仍然是由于返回了指向栈空间的指针。
//5: char *str = {"abcd"};
//00401038 mov dword ptr [ebp-4],offset string "abcd" (0042201c)
//6: return str;
//0040103F mov eax,dword ptr [ebp-4]
//5: char str[] = {"abcd"};
//00401038 mov eax,[string "abcd" (0042201c)]
//0040103D mov dword ptr [ebp-8],eax
//00401040 mov cl,byte ptr [string "abcd"+4 (00422020)]
//00401046 mov byte ptr [ebp-4],cl
//6: return str;
//00401049 lea eax,[ebp-8]
2、例二
#include <iostream>
using namespace std;
int a = 5;
int *example1(int b)
{
a += b;
return &a;
}
int *example2(int b)
{
int c = 5;
b += c;
return &b;
}
int main()
{
int *a1 = example1(2);
int *b1 = example2(4);
cout << " a1 = " << *a1 << endl;
cout << " b1 = " << *b1 << endl;
return 0;
}
结果:
a1 = 7
b1 = 4198610
(注:4198610对应的十六进制为0x4010D2)
分析原因:这是因为在退出某函数后,函数栈帧释放以后,其空间就可以被程序本身的其它部分或者其它程序占用.因而其结果是不确定的.