内存的思考

片段1修改方法有三种:

方法一:可以在GetMemory函数中加上一个返回开辟空间的指针,通过它再对Test函数中的str指针重新赋值,可以解决这个问题。

方法二:由于Test中的str指针指向空,无法将指向空间的有效地址传递给GetMemory的形参,因此只需在Test函数中str指针指向一个非空的空间(不管空间大小多大),同样可以达到解决的效果。

方法三:就是下面的片段3

在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?

        C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字与C 语言的不同。假设某个函数的原型为: void foo(int x, int y);该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int 之类的名字。C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题。

编写strcpy 函数

char* strcpy(char* strDesc, const char* strSrc)
{
assert( (strDesc!=NULL) && (strSrc!=NULL) );  //  确保二者有空间
char* address = strDesc;
while ( (*strDesc++=*strSrc++)!='\0' );
return address;
}

strcpy的返回值的作用:为了实现链式表达式。

编写类String 的构造函数、析构函数和赋值函数

class String
{
public:
String(const char* str = NULL);    //普通构造函数
String(const String& other);    //拷贝构造函数
~String(void);                  //析构函数
String& operator=(const String& other);    //赋值函数
private:
char* m_data;
};
String::String(const char* str /* = NULL */)
{
if(str==NULL)
{
m_data = new char[1];
*m_data = '\0';
}
else
{
int length = strlen(str);
m_data = new char[length+1];
strcpy(m_data,str);
}
}
String::String(const String &other)
{
int length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data,other.m_data);
}
String::~String(void)
{
delete[] m_data;
}
String& String::operator=(const String& other)
{
//检查自赋值
if( this == &other )
return *this;
//释放原有内存资源
delete[] m_data;
//分配新的内存资源,并复制内容
int length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data,other.m_data);
//返回本对象的引用
return *this;
}

参考:来着林锐C/C++高质量编程

林锐高质量编程中的几道面试题相关推荐

  1. Linux C/C++ 编程 内存管理之道:探寻编程世界中的思维乐趣

    内存管理之道:探寻编程世界中的思维乐趣 引言(Introduction) 内存分配区域(Memory Allocation Regions) 内存分配与转移(Memory Allocation and ...

  2. 视频教程-Python编程的术与道:Python语言入门-Python

    Python编程的术与道:Python语言入门 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥ ...

  3. 少儿编程中项目式学习的创造性

    政策利好.市场热门,以少儿编程为载体的计算机科学,俨然已经成为眼下关注的投资和培养方向.一方面,科技浪潮来袭,人机对话的确正在成为一种未来人才的重要能力:另一方面,上手可从搭积木开始,上限又由比尔•盖 ...

  4. 向量几何在游戏编程中的使用

    <1>简单的2-D追踪 -Twinsen编写 -本人水平有限,疏忽错误在所难免,还请各位数学高手.编程高手不吝赐教 -我的Email-address: popyy@netease.com ...

  5. 视频教程-Python编程的术与道:Python语言进阶-Python

    Python编程的术与道:Python语言进阶 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥ ...

  6. java数据库编程中查询结果的表格式输出_Java数据库编程中查询结果的表格式输出...

    派性劳拉德高顺价老僧水牌电烫,湟中胜利财大不恤名花抹胸,果儿四坝风冈普基挡车关掉临池,脑死愀然草荐木笼电能.公话理念湮没不讳公使难看! 摄氏欠安宣和拉道开封关掉明洁名贵.不名滑膜俊美盲女长虹火主乐律超 ...

  7. Java并发编程71道面试题及答案

    Java并发编程71道面试题及答案 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方 ...

  8. 计算机算法对程序设计的作用,计算机编程中数学算法的优化策略

    李钰 摘要:在计算机编程中,合理地运用数学算法所拥有的优势不但可以完好地针对所拥有的问题进行总结分类归纳,还可以将其归纳作为基础从而进行针对性的统一计算,并且能够将非常复杂的问题进行整体的简化并且将其 ...

  9. Java并发编程75道面试题及答案

    1.在java中守护线程和本地线程区别?java中的线程分为两种:守护线程(Daemon)和用户线程(User).任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bo ...

  10. 关于网络编程中MTU、TCP、UDP优化配置的一些总结

    首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层.  其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在 ...

最新文章

  1. 使用Leangoo做销售管理体系
  2. 【转】一文掌握 Linux 性能分析之网络篇(续)
  3. 如何自动设计多流网络 实现GPT3大规模神经网路同等规模的网络
  4. 怎么用最短时间高效而踏实地学习Python?
  5. 实验十一:图形界面二
  6. linux中程序包管理方式出现的原由(转载)
  7. todolist实现删除的功能_使用vue实现删除并输入原因的功能
  8. ejb stateless 包含在哪个包_微信评论能发表情包的那三天,今年最火表情包已有定论?!...
  9. Meta-Programming in Python
  10. 当前版本与卡刷包android_小米5s卡刷包android版本不一致怎么解决
  11. 什么软件能测试显卡功耗,如何在win10中检查计算机的显卡功耗
  12. Mysql - 聚簇索引和辅助索引
  13. 百度大脑OCR助力泰康保险医疗理赔实现智能化
  14. 基于拉丁超立方抽样与自适应策略的改进鲸鱼优化算法
  15. 论文摘要6 - board planar antenna with Circular Polarization
  16. 【Andrew Gelman多元统计】(基于R)
  17. Android 反编译资料整理
  18. 今天是2019年大年三十儿,写了几幅字,给大家拜个年啦
  19. 计算机语言类型和特点,计算机语言-计算机语言的特点
  20. 华硕主板橙色灯亮无法开机

热门文章

  1. robocopy 备份_备份双雄!Robocopy和XXCOPY使用详解
  2. 鸿蒙系统适配的手机型号,华为鸿蒙系统支持的手机型号大全,鸿蒙系统2.0支持手机型号汇总...
  3. SAP系统如何打NOTE?
  4. Python(二)JavaPython混合编程
  5. visio 2016安装教程
  6. 深入浅出Linux操作系统虚拟机环境下载安装(一)
  7. 基于RV1126平台imx291分析 --- open及media graph分析
  8. 01-SQL基本语句
  9. 夜曲编程Python入门课程Pro
  10. phpstudy不安装mysql_MySQL_mysql安装不上怎么办 mysql安装失败原因和解决方法,mysql数据库安装不了了!mysql最 - phpStudy...