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

举报
念君思宁 发表于 2023/02/10 20:17:12 2023/02/10
【摘要】 经典的笔试题解析《高质量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;
}

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

 

该段代码的运行思路:

解析:

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;
}

运行情况为:

 具体的解析为:

在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(空指针)!!!

代码的运行结果为:

 

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

 
#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;
}

上述代码的运行结果为:

 本文就先到此结束!!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。