VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 873|回复: 6

函数返回值为什么不会存在???

[复制链接]

3

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-10-9 11:30:01 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* strsave(char* s)
{
        //第一种情况 可以return
        /*
        char* p = new char(10);
        strcpy(p,"abc");
        */
       
        //第二种情况  不可以return
        char p[10] = {'a', 'b', 'c'};
       
        return p;
}
void main(void)
{
        char* str = "China";
        char* cp;
        cp = strsave(str);
        printf("str = %s , cp = %s\n", str, cp);
}
回复

使用道具 举报

2

主题

20

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-10-9 11:45:01 | 显示全部楼层
第二种情况下p是一个动态局部变量,函数调用结束后空间会被释放,这样你就返回的指针所指向的内容就是不可预料的
而第一种情况由于是用new动态分配内存,所以不会出现这种情况
一定不能返回一个动态局部变量的地址
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-10-9 13:00:02 | 显示全部楼层
局部变量的地址当然不能返回了,因为出了这个函数体就撤销他的地址了。
new一个倒可以。
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-10-9 13:15:01 | 显示全部楼层
char* p = new char(10);
在堆内动态分配数据,一旦分配,一定要用delete才能清除数据,否则数据信息一直保留

char p[10] = {'a', 'b', 'c'};
在栈内分配,只在作用域内有效,出了作用域就消失
回复

使用道具 举报

0

主题

37

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-10-9 19:00:01 | 显示全部楼层
搜索C++内存分配,栈内存与堆内存
回复

使用道具 举报

0

主题

8

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-10-9 19:45:01 | 显示全部楼层
The first case:
use "new" to apply space is available through the main.
回复

使用道具 举报

1

主题

39

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-10-9 21:15:01 | 显示全部楼层
new 是超出一般性质的作用域的申请内存的方法.
也就是new后,语言不管理你这个内存空间,而是你自己去管理.

除此之外,语言的特性会自动的帮你回收掉一些内存空间.

void fun()
{
int i; // 这里的i 的内存空间申请了
}
// 在外面就被释放了.
//这个就是所谓的作用域的生命周期, 也就是超出作用域会释放掉的内存空间.

作用域分为(不标准命名):
1.函数作用域,就是函数范围,跳出函数就释放掉
2.表达式作用域, 就是一个表达式申请,超出这个表达式就删掉的内存
3.程序作用域, 程序结束就释放掉的内存.

要注意的是,虽然有这些作用域限制,但是并不是非要用new才能传递变量.只要将内部范围的变量
复制到外部范围就能传递了.但是话说回来,数组是不能直接复制的,数组名传递的是他的地址,而用
这个访问的还是原来的空间,这就会出现问题.



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表