经典的笔试题解析(返回栈空间地址的问题)

举报
念君思宁 发表于 2023/02/10 20:14:46 2023/02/10
【摘要】 经典的笔试题解析(返回栈空间地址的问题)

对于《高质量C/C++编程》,想必这个已经是早已成名的经典书籍了!!在此,笔者借用两三个题目!!

解析下面代码:(错误示列,请勿模仿)正确的代码,在后面部分!!!

#include <stdio.h>
 
char* getmemry()
{
	char pc[] = "hello world";
	return pc;
}
 
void test()
{
	char* str = NULL;
	str = getmemry();
	printf(str);
}
 
int main()
{
	test();
	return 0;
}

对于这个代码,是一个错误的!!下面请看代码的运行结果:(大大出乎意料)

 下面进入该段代码的解析部分:

 在test函数里面,定义了str,str里面存放的是NULL(空指针),然后通过调用getmemry函数,在getmemry函数内部创建了一个局部的数组p,数组p里面存放了“hello world",p是数组名,表示数组的首元素的地址,return p;返回的是”h"的地址,假设地址为:0x0012ff40,则str里面存放的为:0x12ff40;即指向hello world ;对于上面的内容看似想象的确实挺不错的,但是遗憾的是:char pc[] = "hello world";  是一个局部的数组,在进这个函数的时候创建,在出这个函数的时候,就销毁了,而所谓的销毁就是:将那一块空间的内容还给操作系统了,其空间的使用权限归操作系统,但是,那个地址,还是那个地址,没有发生变化!!!所以上面代码的运行结果出现了错误!!

因此,我们要返回栈空间的变量(正确)

#include <stdio.h>
 
int test()
{
	int a = 10;
	return a;
}
 
int main()
{
	int ret = test();
	printf("ret=%d\n", ret);
}

上面的这个就是我们所熟知的函数的调用简单代码!!并且是正确的写法!!代码的运行结果为:

 但是,当我们返回栈空间地址的话,就会出现错误!!(错误写法)

//错误代码!!
 
#include <stdio.h>
 
int test()
{
	int a = 10;
	return &a;
}
 
int main()
{
	int* ret = test();
	printf("ret=%d\n", *ret);
}

代码运行不起来,直接崩溃!!

解析:在test函数中,a出函数的时候,就被销毁了,ret记录下的位置,已经没有啥用了,是一个野指针!!ret所指向的空间已经释放掉了,但是当打印结果为10时,只能说明,恰好没被修改,但是,代码仍然是错误的!!!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。