现代程序设计——homework-08
写在前面
以下内容出自一个对C++只有一点点了解,几乎没有写过C++程序的人,理解上的一定会很不到位,请各位路过神牛多多指点。
博客内容为对
http://www.cnblogs.com/softwareTA/p/3419223.html
中相关问题的思考。
我的解答
1、生命周期
这个东西如果我能用十行代码演示,那我一定不是一个新手儿了,因为关于生命周期不同类型、不同版本的编译器是不一样的!
同一份代码:
#include <iostream>
using namespace std;
char* pointer_toStr()
{
char *s = "abcdefghijkl";
return s;
}
char* toStr()
{
char s[] = "abcdefghijkl";
return s;
}
int* toArray()
{
int s[] ={,,};
return s;
}
int main()
{
cout<<toStr()<<endl;
cout<<pointer_toStr()<<endl;
int* aaa;
aaa=toArray();
cout<<aaa[]<<endl;
return ;
}
第一个问题:
cout<<toStr()<<endl的结果是什么?
为了回答这个问题而产生的一系列问题:
int* toArray()
{
int s[] ={,,,,,,,,,};
return s;
}
int main()
{
int* array;
array=toArray();
printf("%d\n",array[]);
printf("%d\n",array[]);
printf("%d\n",array[]);
int i;
array=toArray();
for(i=;i<;i++)
;
printf("%d\n",array[]);
printf("%d\n",array[]);
printf("%d\n",array[]);
int arra[];
array=toArray();
for(i=;i<;i++)
arra[i]=array[i];
for(i=;i<;i++)
printf("%d\n",arra[i]);
}
这份代码的运行结果是什么?
对于问题1,看结果:
在Code::Blocks10.05+GNU GCC Compiler中,结果如下:

在VS 2012中
改了一个C语言版本的代码,结果如下:

PS:这个版本的函数调用顺序有一点点变化
对于引出的一系列问题:

看到这个结果,尼玛跟我开玩笑呢吧!
我的解释:
生命周期固然是函数调用返回之后就GameOver了,但是,这句话应该这么说,函数调用返回之后运行栈内的生命就GameOver了,堆中的内存,编译器是不能准确知道它的生命周期是什么时候结束的。在C++编程思想中有这么一段话:“注意,C 堆管理器相当重要,它给出内存块,对它们使用free( )时就回收它们。没有对堆进行合并的工具,如果能合并就可以提供更大的空闲块。如果程序多次分配和释放堆存储,最终会导致这个堆有大量的空闲块,但没有足够大且连续的空间能满足我们对内存分配的需要。但是,如果用堆合并器移动内存块,又会使得指针保存的不是相应的值”。
我们的结果也能证明这一点,函数返回了,堆中的生命还在苟延残喘,你还有几纳秒的时间来使用它们。当然这是有情可原的,堆操作本来就慢,再加上函数返回那么多事儿要处理,CPU哪有闲情管你呃。那么,什么时候堆上的东西正式死亡呢?函数返回之后并且这片空间被再次使用(对于编译分配的读写均可,对于malloc分配的,只有写)之后才正式死掉!
2、堆栈分配
这个话题好大有没有!同一个变量放在什么地方即使同一种、同一版本在不同机器上都可能不同!
int array[]={1,2,3,4,5,6,7,8,9,0};和int *array=(int *)malloc(sizeof(int)*n);但是释放的方式是不一样的,后者只要不free(),它就一直在。前者上面已经解释过了。
int* Malloc_Array(int n)
{
int *array=(int *)malloc(sizeof(int)*n);
for(int i=;i<;i++)
array[i]=i;
return array;
}
int* Stack_Array()
{
int array[];
for(int i=;i<;i++)
array[i]=i;
return array;
}
int _tmain(int argc, _TCHAR* argv[])
{
int *m_Array=Malloc_Array();
int *s_Array=Stack_Array();
for(int i=;i<;i++)
printf("%d\n",m_Array[i]);
for(int i=;i<;i++){
printf("%d\n",s_Array[i]);
}
free(m_Array);
for(int i=;i<;i++)
printf("%d\n",m_Array[i]);
system("pause");
return ;
}
这个运行结果大家基本都能正确写出来的。
3、智能指针
此处略,我没做过太大的工程,这个东西太耗效率,我不喜欢。
4、分割URL
// LifePeriord.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <string>
#include <memory>
using namespace std;
using std::cin;
//int array[]={1,2,3,4,5,6,7,8,9,0};
int _tmain(int argc, _TCHAR* argv[])
{
string url;
//std::shared_ptr<string> p_url(std::string url);
cin >> url;
//p_url=&url;
int i=;
for(i=;url[i]!='\0';i++){
switch (url[i])
{
case ':':
if(url[i+]=='/'&&url[i+]=='/'){
i+=;
}
putchar(',');
break;
case '/':
case '.':
putchar(',');
break;
default:
putchar(url[i]);
break;
}
}
system("pause");
return ;
}
搞成这么简单完全可以吧!不惧任何一个能访问的URL测试!
现代程序设计——homework-08的更多相关文章
- 现代程序设计homework——04
题目: 详见:http://www.cnblogs.com/xinz/p/3341551.html 题目本身确实很难,“很难想到一个比较优雅的算法”,这是一个老师请来专门讲解这道题的大牛的原话.确实, ...
- 软工+C(9): 助教指南,持续更新...
上一篇:提问与回复 下一篇:从命令行开始逐步培养编程能力(Java) 目录: ** 0x00 Handshake ** 0x01 点评 ** 0x02 评分 ** 0x03 知识储备 ** 0x04 ...
- 20145219 《Java程序设计》第08周学习总结
20145219 <Java程序设计>第08周学习总结 教材学习内容总结 通用API 日志API 1.java.util.logging包提供了日志功能相关类与接口,使用日志的起点是log ...
- 2016CCPC东北地区大学生程序设计竞赛【01/03/05/06/08】
吧啦啦啦啦啦啦啦啦啦啦啦能量,ACM,跨!变身!变成一个智障! 04正在酝酿中!!!马上更新!!!!! 01题意:有一个n个点的图,对于任意两个不同的点,他的权值是两个点下标的最小公倍数,求最小生出 ...
- Python Revisited Day 08 (高级程序设计技术)
目录 8.1 过程型程序设计进阶 8.1.1 使用字典进行分支 8.1.2 生成器表达式与函数 8.1.3 动态代码执行与动态导入 动态程序设计与内省函数(表) 动态代码执行 eval(), exec ...
- 20145210 《Java程序设计》第08周学习总结
第十四章 NIO与NIO2 14.1 认识NIO •NIO概述 •NIO使用频道来衔接数据结点 •在处理数据时,NIO可以让你设定缓冲区容量 •Channel架构与操作 •isOpen():确认Cha ...
- 团体程序设计天梯赛L2-013 红色警报 2017-03-23 22:08 55人阅读 评论(0) 收藏
L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...
- 长春理工大学第十四届程序设计竞赛(重现赛)L.Homework Stream
链接:https://ac.nowcoder.com/acm/contest/912/L 题意: 作为大珩班尖子生,小r每天有很多作业要完成,例如工图.工图和工图. 很显然,做作业是要有顺序的.作业之 ...
- C语言作业|08
问题 答案 这个作业的属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/9977 我 ...
- C语言I作业08
C语言I作业08 这个作业属于哪个课程 C语言程序设计ll 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/9981 ...
随机推荐
- TCP-心跳
心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包. 用来判断对方(设备,进程或其它网元)是否正常运行,采用定时发送简单的通 ...
- LRU缓存算法
http://blog.csdn.net/beiyeqingteng/article/details/7010411 http://blog.csdn.net/wzy_1988/article/det ...
- 8天学通MongoDB——第七天 运维技术
这一篇我们以管理员的视角来看mongodb,作为一名管理员,我们经常接触到的主要有4个方面: 1. 安装部署 2. 状态监控 3. 安全认证 4. 备份和恢复, 下面我们就一点一点的讲解. 一 ...
- System.exit(0)
表示程序正常退出 System.exit(status) 当status非0时,表示程序为非正常退出. status=0, 关闭当前正在运行的虚拟机. 求质因数分解的程序如下: 两种算法: 一种是用S ...
- iOS开发:在Swift中调用oc库
先列举这个工程中用到的oc源码库: MBProgressHUD:半透明提示器,Loading动画等 SDWebImage:图片下载和缓存的库 MJRefresh: 下拉刷新,上拉加载 Alamofir ...
- GridView表头排序方法设置
1.效果图 2.前台代码 说明:红色代码为核心代码 <asp:GridView ID="gvData" runat="server" AutoGenera ...
- 由于管理员设置的策略,该磁盘处于脱机状态-Win 2008 R2
问题截图: 做了个小说网站www.114369.cn,使用的是云主机,系统是Win 2008 R2,进入服务器后发现磁盘有问题 只有c盘,没有d盘,提示:由于管理员设置的策略,该磁盘处于脱机状态 解决 ...
- MySql表中key的区别
我们看到Key那一栏,可能会有4种值,即'啥也没有','PRI','UNI','MUL'1. 如果Key是空的, 那么该列值的可以重复, 表示该列没有索引, 或者是一个非唯一的复合索引的非前导列2. ...
- 【Java】Java处理double相加的结果异常
方式一(四舍五入):保留两位小数 double f = 111231.5585; BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2, ...
- 关于web安全
从技术到安全, 这是一个趋势. 以前追求的是比较炫酷的技术, 等实现过后发现, 自己还能做什么. 炫技完了之后,差不多就该到悟道的时候了. 用户安全, 就是一个很大的禅. 苹果拒绝 FBI, goog ...