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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 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


本文就先到此结束!!


相关文章
|
28天前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
42 2
|
28天前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
45 0
|
1天前
|
安全 Java 开发者
Java并发编程中的锁机制解析
本文深入探讨了Java中用于管理多线程同步的关键工具——锁机制。通过分析synchronized关键字和ReentrantLock类等核心概念,揭示了它们在构建线程安全应用中的重要性。同时,文章还讨论了锁机制的高级特性,如公平性、类锁和对象锁的区别,以及锁的优化技术如锁粗化和锁消除。此外,指出了在高并发环境下锁竞争可能导致的问题,并提出了减少锁持有时间和使用无锁编程等策略来优化性能的建议。最后,强调了理解和正确使用Java锁机制对于开发高效、可靠并发应用程序的重要性。
9 3
|
1月前
|
测试技术 开发者 Python
Python 编程中的装饰器深入解析
【8月更文挑战第1天】本文将通过实例和代码演示,深入探讨 Python 中装饰器的概念、用法和高级应用。我们将从基础开始,逐步过渡到如何自定义装饰器,并展示其在日志记录、性能测试等场景下的实际用途。文章最后还将讨论装饰器的常见误区和最佳实践。
|
19天前
|
Rust 安全 C++
系统编程的未来之战:Rust能否撼动C++的王座?
【8月更文挑战第31天】Rust与C++:现代系统编程的新选择。C++长期主导系统编程,但内存安全问题频发。Rust以安全性为核心,通过所有权和生命周期概念避免内存泄漏和野指针等问题。Rust在编译时确保内存安全,简化并发编程,其生态系统虽不及C++成熟,但发展迅速,为现代系统编程提供了新选择。未来有望看到更多Rust驱动的系统级应用。
38 1
|
1月前
|
SQL 存储 算法
【数据挖掘】恒生金融有限公司2023届秋招数据ETL工程师笔试题解析
恒生科技2022年9月24号数据ETL工程师岗位的笔试题目及答案汇总,包括了SQL选择题、SQL编程题和业务应用SQL编程题,涵盖了数据库基础知识、SQL语句编写以及数据仓库概念等多个方面。
37 2
【数据挖掘】恒生金融有限公司2023届秋招数据ETL工程师笔试题解析
|
1月前
|
机器学习/深度学习 自然语言处理 算法
【数据挖掘】2020奇安信秋招算法方向试卷1 笔试题解析
2020年奇安信秋招算法方向试卷1的题目解析,覆盖了数据结构、机器学习、深度学习、自然语言处理、排序算法、激活函数、主题模型、采样方法、图像处理等多个领域的知识点。
38 1
【数据挖掘】2020奇安信秋招算法方向试卷1 笔试题解析
|
1月前
|
机器学习/深度学习 存储 算法
【数据挖掘】2020奇安信秋招算法方向试卷3 笔试题解析
2020年奇安信秋招算法方向试卷3的题目解析,涵盖了数据结构、机器学习、深度学习、自然语言处理、排序算法、激活函数、PCA、词嵌入库等多个领域的知识点。
33 1
【数据挖掘】2020奇安信秋招算法方向试卷3 笔试题解析
|
22天前
|
SQL 设计模式 安全
Java编程中的单例模式深入解析
【8月更文挑战第27天】本文旨在探索Java中实现单例模式的多种方式,并分析其优缺点。我们将通过代码示例,展示如何在不同的场景下选择最合适的单例模式实现方法,以及如何避免常见的陷阱。
|
5天前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
18 0

推荐镜像

更多