返回,局部,指针。

内存的分配方式

分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题

1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。

2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。

3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。

// Test2.cpp
#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)

分析原因:这是因为在退出某函数后,函数栈帧释放以后,其空间就可以被程序本身的其它部分或者其它程序占用.因而其结果是不确定的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值