经典的笔试题解析《高质量C/C++编程》

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 经典的笔试题解析《高质量C/C++编程》

对于《高质量C/C++编程》,想必这个已经是早已成名的经典书籍了!!在此,笔者借用两三个题目!!


解析下面代码:(错误示列,请勿模仿)正确的代码,在后面部分!!!


#include <stdio.h>
void getmoney(char* p)
{
  p = (char*)malloc(100);
}
void test()
{
  char* str = NULL;
  getmoney(str);
  strcpy(str, "hello world");
  printf(str);   //这个写法也可以!!
}
int main()
{
  test();
  return 0;
}

该错误代码的运行结果为:


0a2653c851af460fa595bd959398a8f1.png


该段代码的运行思路:


2d65d23f6d4748949b924e4057485923.png


解析:


1。首先在main 函数里面走到test函数,test函数里面定义了一个变量str,str里面存放的是一个空指针(NULL),通过getmoney函数的调用,将str传递过去,将str这个变量本身传递过去,而p也是个指针变量,将str里面的内容(NULL)传给变量p,即p得到的也是空指针(NULL),在getmoney函数里面,开辟了100个字节的空间,强制类型转化为:char*类型(返回类型),将这100个字节空间的起始地址放在p里面,(假设起始地址为:0x003f4056),即,此时的p,就间接指向了那100个字节空间的起始地址,但是,p是一个指针变量,给p里面放东西了,那str会发生改变吗??答案是:不会影响str!!!原因;str与p不是同一个变量(把地址放在p里面跟str没有关系)在test函数中,此时str仍为空指针!!在strcpy(str,"hello world")中,将会出现错误!!将“hello world "放在str里面,必然会涉及解引用操作!但是对于空指针,该如何进行解引用操作??故,出现了错误!!


2.对于printf(str)  这个写法没有错误!!


 (1)。printf(”hello world"); printf函数在打印的时候,传递的不是hello world ,而是传给printf的为‘h'的地址!!


(2)。char * p="hello world"  ,在这个里面:hello world 是一个字符表达式,相当于:printf(p) ,首字符h的地址放在p里面!!即,p指向’h'!


对于上述代码的错误总结:


(1)对于上述代码在:strcpy(str, "hello world") 时,程序已经崩溃!!


(2) 但是,对于malloc函数开辟的内存空间,没有free,存在内存泄漏的问题,


(3)对于getmoney函数里面,malloc函数返回值是否为空指针的判断!!


经过上面的简短分析,我们可以这样写正确的代码:



#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void getmoney(char** p)
{
  *p = (char*)malloc(100);
}
void test()
{
  char* str = NULL;
  getmoney(&str);
  strcpy(str, "hello world");
  printf(str);
  //释放
  free(str);
  str = NULL;
}
int main()
{
  test();
  return 0;
}

运行情况为:


6de278e6d6694ce5bb08e7e842b7e74b.png


具体的解析为:


在test函数内部,创建str,在str里面,刚开始存放的是NULL(空指针),通过getmoney函数将str的地址传过去!假设str的地址为:0x0012ff40(一级指针的地址,需要用二级指针来接收)即指针变量p来接收,即,p里面存放的就是0x0012ff40,即,p指向str,而*p = (char*)malloc(100);开辟了100个字节的空间放在*p里面去,即放在str里面,假设,这100个字节的空间的起始地址为:0x34ff000045,所以,将0x34ff000045,放在str里面去了,strcpy(str, "hello world");把 hello world拷贝到str所指向的空间(malloc函数开辟的100个自己的空间),最后,用完了再释放掉,然后再置为NULL(空指针)!!!


代码的运行结果为:


12c3b7f3f8814309a195c64f051d4445.png


另外一种也是正确的写法为:


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char* getmoney(char* p)
{
  p = (char*)malloc(100);
  return p;
}
void test()
{
  char* str = NULL;
  str = getmoney(str);
  strcpy(str, "hello world");
  printf(str);
  //释放
  free(str);
  str = NULL;
}
int main()
{
  test();
  return 0;
}


上述代码的运行结果为:


34e8d716411043c08c7ffba9fbba23de.png


本文就先到此结束!!


相关文章
|
1月前
|
存储 C++ UED
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
228 65
|
15天前
|
自然语言处理 编译器 Linux
|
15天前
|
安全 程序员 API
|
12天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
11天前
|
设计模式 安全 Java
Java编程中的单例模式深入解析
【10月更文挑战第31天】在编程世界中,设计模式就像是建筑中的蓝图,它们定义了解决常见问题的最佳实践。本文将通过浅显易懂的语言带你深入了解Java中广泛应用的单例模式,并展示如何实现它。
|
21天前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
|
23天前
|
Java 开发者 UED
Java编程中的异常处理机制解析
在Java的世界里,异常处理是确保程序稳定性和可靠性的关键。本文将深入探讨Java的异常处理机制,包括异常的类型、如何捕获和处理异常以及自定义异常的创建和使用。通过理解这些概念,开发者可以编写更加健壮和易于维护的代码。
|
30天前
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
86 6
|
1月前
|
Java 关系型数据库 MySQL
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
131 1
|
1月前
|
Java
【编程基础知识】《Java 基础探秘:return、break、continue、label、switch 与 enum 的深度解析》
本文深入解析了 Java 中的 return、break、continue、label、switch 和 enum 等基础概念,通过代码示例和流程图,帮助读者理解这些控制结构和枚举类型在编程中的应用,提升编程能力。
25 3

推荐镜像

更多