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

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

对于《高质量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;
}

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


0a2653c851af460fa595bd959398a8f1.png


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


2d65d23f6d4748949b924e4057485923.png


在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);
}

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


6de278e6d6694ce5bb08e7e842b7e74b.png


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


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


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


12c3b7f3f8814309a195c64f051d4445.png


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


相关文章
|
1月前
|
C语言
【进阶C语言】数组笔试题解析
【进阶C语言】数组笔试题解析
17 0
|
3月前
|
算法 C++ 容器
C++ STL:空间配置器源码解析
C++ STL:空间配置器源码解析
|
10天前
|
域名解析 网络协议 Linux
TCP/IP协议及配置、IP地址、子网掩码、网关地址、DNS与DHCP介绍
TCP/IP协议及配置、IP地址、子网掩码、网关地址、DNS与DHCP介绍
|
1月前
|
域名解析 缓存 网络协议
探索Qt 网络编程:网络地址与服务类全解析
探索Qt 网络编程:网络地址与服务类全解析
56 0
|
2月前
|
存储 弹性计算 固态存储
阿里云服务器租用费用1t空间多少钱?全面解析
阿里云服务器租用费用1t空间多少钱?1T空间如果是系统盘SSD云盘价格是3686元一年、ESSD云盘1t空间是5222元一年,ESSD Entry云盘1024G存储空间价格是2580元一年。阿里云百科整理几款不同的云盘1t空间价格
|
2月前
|
域名解析 弹性计算 网络协议
DNS服务器问题之翻译为 TCP/IP 地址如何解决
DNS服务器是负责将域名转换为IP地址的服务,它是互联网上实现域名解析的关键基础设施;本合集将探讨DNS服务器的工作原理、配置方法和常见问题处理,帮助用户理解和优化DNS服务的使用。
38 7
|
2月前
|
JavaScript 前端开发 区块链
最新视频连接解析地址
最新视频连接解析地址
28 0
|
3月前
|
存储
【深入解析:数据结构栈的魅力与应用】
【深入解析:数据结构栈的魅力与应用】
|
3月前
|
存储 C语言
【C语言进阶篇】 数组常考笔试题万字解析(下)
【C语言进阶篇】 数组常考笔试题万字解析(下)
13 0
|
4月前
|
JavaScript 前端开发 API
(简单详细)javascript中new url()属性,轻松解析url地址
(简单详细)javascript中new url()属性,轻松解析url地址
130 0

推荐镜像

更多