现代程序设计——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 ...
随机推荐
- EINTR错误
慢系统调用(slow system call):此术语适用于那些可能永远阻塞的系统调用.永远阻塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类.如:若没有客户连接到服务器上,那么服 ...
- PHP文件下载原理
1.php下载原理图 2.文件下载源码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <?php $ ...
- 车牌识别LPR(二)-- 车牌特征及难点
第二篇:车牌的特征及难点 2.1 对我国车牌的认识 我国目前使用的汽车牌号标准是 2007 年开始实施的<中华人民共和国机动车号牌>GA36-2007(2010 年修订).根据 GA36 ...
- (五)CSS伪类(Pseudo-class)
CSS伪类用于向某些选择器添加特殊的效果.伪类的语法如下: selector : pseudo-class {property: value} CSS类也可以与伪类搭配使用: selector.cla ...
- 抽象工厂在ADO.Net中的应用
https://msdn.microsoft.com/zh-cn/library/ms971499.aspx http://www.c-sharpcorner.com/UploadFile/moses ...
- MyBatis学习总结3-优化MyBatis配置文件
连接数据库配置优化 可以将数据库连接配置信息卸载conf.xml中,但是为了优化连接,专门写一个properties用于存数据库连接信息,然后在conf.xml中进行引用,里面包括数据库驱动,地址,用 ...
- 1227. Rally Championship
1227 题意木看懂 是可以停在路上 任何地方 水题一枚 以下条件之一满足就可以 有环(并查集判) 重边 自己到自己的边 最长边大于s(用flod改写下) #include <iostream& ...
- bzoj3242
如果是树,那么一定选择树的直径的中点 套了个环?裸的想法显然是断开环,然后求所有树的直径的最小值 环套树dp的一般思路,先把环放到根,把环上点下面的子树dp出来,然后再处理环上的情况 设f[i]表示以 ...
- SharedPreferencesUtil
用于缓存一个临时的变量 比如 SharedPreferencesUtil.put(getApplicationContext(), "userImage", user.conten ...
- Android中shape中的属性大全
---恢复内容开始--- <shape> <!-- 实心 --> <solid android:color="#ff9d77"/> <!- ...