写在前面

  以下内容出自一个对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的更多相关文章

  1. 现代程序设计homework——04

    题目: 详见:http://www.cnblogs.com/xinz/p/3341551.html 题目本身确实很难,“很难想到一个比较优雅的算法”,这是一个老师请来专门讲解这道题的大牛的原话.确实, ...

  2. 软工+C(9): 助教指南,持续更新...

    上一篇:提问与回复 下一篇:从命令行开始逐步培养编程能力(Java) 目录: ** 0x00 Handshake ** 0x01 点评 ** 0x02 评分 ** 0x03 知识储备 ** 0x04 ...

  3. 20145219 《Java程序设计》第08周学习总结

    20145219 <Java程序设计>第08周学习总结 教材学习内容总结 通用API 日志API 1.java.util.logging包提供了日志功能相关类与接口,使用日志的起点是log ...

  4. 2016CCPC东北地区大学生程序设计竞赛【01/03/05/06/08】

    吧啦啦啦啦啦啦啦啦啦啦啦能量,ACM,跨!变身!变成一个智障! 04正在酝酿中!!!马上更新!!!!!  01题意:有一个n个点的图,对于任意两个不同的点,他的权值是两个点下标的最小公倍数,求最小生出 ...

  5. Python Revisited Day 08 (高级程序设计技术)

    目录 8.1 过程型程序设计进阶 8.1.1 使用字典进行分支 8.1.2 生成器表达式与函数 8.1.3 动态代码执行与动态导入 动态程序设计与内省函数(表) 动态代码执行 eval(), exec ...

  6. 20145210 《Java程序设计》第08周学习总结

    第十四章 NIO与NIO2 14.1 认识NIO •NIO概述 •NIO使用频道来衔接数据结点 •在处理数据时,NIO可以让你设定缓冲区容量 •Channel架构与操作 •isOpen():确认Cha ...

  7. 团体程序设计天梯赛L2-013 红色警报 2017-03-23 22:08 55人阅读 评论(0) 收藏

    L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...

  8. 长春理工大学第十四届程序设计竞赛(重现赛)L.Homework Stream

    链接:https://ac.nowcoder.com/acm/contest/912/L 题意: 作为大珩班尖子生,小r每天有很多作业要完成,例如工图.工图和工图. 很显然,做作业是要有顺序的.作业之 ...

  9. C语言作业|08

    问题 答案 这个作业的属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/9977 我 ...

  10. C语言I作业08

    C语言I作业08 这个作业属于哪个课程 C语言程序设计ll 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/9981 ...

随机推荐

  1. 协同滤波 Collaborative filtering 《推荐系统实践》 第二章

    利用用户行为数据 简介: 用户在网站上最简单存在形式就是日志. 原始日志(raw log)------>会话日志(session log)-->展示日志或点击日志 用户行一般分为两种: 1 ...

  2. c语言头文件和源文件不在同一个目录

    http://www.cnblogs.com/ShaneZhang/archive/2013/05/20/3088688.html 从工程上讲,头文件的文件名应该与对应的源文件名相同便于维护,如果头文 ...

  3. c#关键字详解

    c#关键字   关键字是对编译器有特殊意义的预定义的保留标识符.它们不能在程序中用作普通标识符,除非在它们前面加上@前缀. 第一部分 一.访问关键字:base,this base:访问基类的成员. 用 ...

  4. MyBatis学习总结4--解决字段名与实体类属性名不相同的冲突

    在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定是完全相同的,如果直接在xml映射文件中使用sql进行映射,会造成返回值为空的情况,下面阐述解决方案: 测试所用表和数据 create t ...

  5. vi编辑器基本用法介绍

    vi是Linux系统中编写文件的工具 如果vi出现乱码情况,需要升级vi,命令如下: sudo apt-get install vim  //升级vi vi的启动方式有两种,直接使用vi命令和在vi命 ...

  6. noi2002银河英雄传说(并查集)

    首先表示对C++读入读出问题复杂程度的敬畏,看了好多没讲明白的,本题用cin竟然过不了评测,搞scanf的读入搞了好久.... 本题确实是一道经典的并查集题型,不多讲,拿来练练手用的(其中经历很惨) ...

  7. iOS开发:iOS的整体架构以及API介绍

    iOS的整体架构分为4层——Cocoa Touch层.Media层.Core Services层和Core OS层,下面概要介绍一下这4层. Cocoa Touch:构建iOS应用的一些基本系统服务, ...

  8. Windows SDK 实现不规则窗口介绍

    不规则窗口在程序界面设计中能提供非常好的用户体验,以下是我程序运行时的效果图: 以下是代码,注意需要修改一些简单的位置,如资源ID,项目的头文件等,这些是根据你创建的win32程序的项目名改变的,我的 ...

  9. Sublime-text markdown with Vim mode and auto preview

    说明 最近看到markdown相关的东西,被其书写方式吸引,其实以前就在找这种类似的工具,但是也没找到,由于习惯了Vim,可Vim不支持markdown预览,这点可能不是很好,于是找到Sublime- ...

  10. 流媒体相关知识介绍 及其 RTP 应用

    一.流媒体简介 随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等多媒体格式过渡.目前在网络上传输音频/视频(Audio/Video,简称A/V)等多媒 ...