关于返回局部变量地址的一些思考

问题描述

在华为培训中碰到了下面的返回局部变量地址的代码。

1
2
3
4
5
6
7
8
9
10
struct QueryTable *QueryTableAdapter(key)
{
struct QueryTable stAdaptor[m] = {...};
// 进行查表
if(查表成功)
{
return &(stAdaptor[n]); //m > n
}
}

但是在看The Practice of Programming的时候碰到了以下代码

1
2
3
4
5
6
7
8
9
10
/* newitem: create new item from name and value */
Nameval *newitem(char *name, int value)
{
Nameval *newp;
newp = (Nameval *)emalloc(sizeof(Nameval));
newp->name = name;
newp->value = value;
newp->next = NULL;
return newp;
}

第一段代码返回局部变量地址就发生了错误,但是第二段代码返回局部变量地址就正确

思路解析

第一段代码的返回了一个数组的地址,数组是在栈上分配的,当从函数退出时,
调用者拿到了数组的地址,但是栈上分配的数据已经回收

内存分配图

picture

第二段代码返回的是一个在堆上分配的数据结构的地址,当从函数退出时,
调用者拿到了结构体的地址,但是堆上分配的数据还存在

内存分配图

picture

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章