C/C++练习题(二)
1、下面这些指针分别代表什么?
float(**p1)[10];
double*(*p2)[10];
double(*p3[10])();
int*((*p4)[10]);
long(**p5)(int(*a)[]);
p1是一个二维指针,它指向的一维指针又指向了一个数组,这个数组的类型是float[10];
p2是一个指针,它指向了一片数组,这个数组的每个元素的类型是double;
p3是一个10个元素的数组,数组的每个元素都是一个函数指针,即double()();
p4是一个二维指针,这个二维指针指向了一个函数指针(注意指向的不是函数而是函数指针),这个函数指针指向的函数的返回值是long,参数是一个指向类型为int大小为10的一个数组。
2、查找字符串中第一个只出现一次的字符并输出。(如:aabbcddefg 则输出 'c')
分析:这个问题只要考察是否有空间换时间的思想。
因为这里出现的都是ASCII码,所以我们建立一个大小为256的数组,之后遍历字符串,以字符串中的字符为下标累加数组元素,这样我们就可以得到一个直方图。
void findOneChar(const char* str)
{
	int array[256] = {0};
	char* p = (char*)s;
	while( *p )
	{
		array[*p++]++;
	}
	while( *s && (array[*s] != 1) )
	{
		s++;
	}
	printf("%c\n", *s);
}
1、下面程序有问题吗?如果有,请指出。
#include <stdio.h>
char* ptr = (char*)malloc(10);
void main(void)
{
	if(NULL == ptr)
	{
		printf("malloc failed!\n");
		return;
	}
	else
	{
		// Do something...
	}
	return;
}
1、程序中使用了malloc,起码要包含一些头文件吧;
2、ptr是全局变量,全局变量要使用常量来初始化。这里会编译出错。
3、即使忽略上面的情况,程序也可能会造成内存泄露,大家可能认为现代OS在进程结束的时候就会回收这个进程申请的内存资源,但是如果致力于嵌入式开发,我们就需要考虑一些小型的操作系统,因为一些特殊的目的并没有实现这样的自动回收功能,所以,必须要谨慎。
2、下面程序有问题吗?如果有,请指出并修改。
#include <stdio.h>
int main(int argc, char* argv[])
{
	int flag = 0;
	char passwd[10];
	memset(passwd, 0, sizeof(passwd));
	strcpy(passwd, argv[1]);
	if(0 == strcmp("LinuxGeek", passwd))
	{
		flag = 1;
	}
	if(flag)
	{
		printf("PASS\n");
	}
	else
	{
		printf("ERROR\n");
	}
}
除开那些包含头文件之类的错误,这个程序最大的问题就是安全性。
这个程序从功能来看是用来检测密码的,如果用户输入LinuxGeek的时候通过检测,但是由于使用了strcpy和strcmp,那么当用户输入超过10的时候就会产生越界。**由于栈地址是从高地址往低地址增长的,所以passwd后面的空间恰好是flag对应的空间**,这样当输入超过长度为10的字符串时,flag就会被修改成非0值**(经过测试bcc32 结果为error , qt下为pass,所以有没有污染还是要看编译器,但是我们不能编写依赖编译器的代码,一定要规范。)**,于是检测通过,PASS就会被输出。
所以我们应该使用strncpy和strncmp来加强安全性。
3、有两个程序a和b都有相同的代码,如下:
 int buffer[16]
 ......
printf("%p", &buffer[0]);
printf("buffer[0] = %d", buffer[0]);
同时运行a和b最终程序输出:
0x20001300    buffer[0] = 100
0x20001300    buffer[0] = 1000
为什么会有相同和不同的结果??
首先,为什么两个程序的数组地址居然一样呢?
题目没有说明是什么样的数组,是全局的还是局部的,但是两个程序的代码是一样的,如果使用相同的编译器的话,最终生成的可执行程序也是一样的。
好,现在程序运行成为进程。
要知道,现代操作系统都有虚拟空间的,每个进程独享自己的4G虚拟空间,所以说这里的地址一样。程序运行的实际物理地址是不一样的,但是我们看不到;至于buffer[0]的值不同,是因为没有初始化,值是随机的。
C/C++练习题(二)的更多相关文章
- Linux基础练习题(二)
		Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ... 
- python/MySQL练习题(二)
		python/MySQL练习题(二) 查询各科成绩前三名的记录:(不考虑成绩并列情况) select score.sid,score.course_id,score.num,T.first_num,T ... 
- 第三十三章 linux常规练习题(二)
		一.练习题一 1.删除用户基本组shanghai03.发现无法正常删除,怎样才能将其删除掉,不能删除用户.2.打开多个xshell窗口连接登录同一虚拟机,使用不同的用户登录多次,分别使用w和who命令 ... 
- PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。
		Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ... 
- python六十四课——高阶函数练习题(二)
		总结:高阶函数以及匿名函数之间的配合使用 from functools import reduce #模块一:lambda和filter的结合使用 #lt = [1,2,3,4,5,6,7,8,9] ... 
- PHP练习题二
		1.抓取远程图片到本地,你会用什么函数? fsockopen, A 2.用最少的代码写一个求3值最大值的函数. function($a,$b,$c){* W0 z* u6 k+ e. L a: }5 ... 
- PHP练习题(二)
		程序6.题目: 假设某人有100,000现金,每经过一次路口需要进行一次交费交费规则为当他现金大于50,000时每次需要交%5,如果现金小于等于50,000时每次交5,000.问此人可以经过多少次这个 ... 
- Python3.7 练习题(二) 使用Python进行文本词频统计
		# 使用Python进行词频统计 mytext = """Background Industrial Light & Magic (ILM) was starte ... 
- 廖雪峰python3练习题二
		字符串和编码 题目: 答案: #!/usr/bin/env python3 #-*- coding:utf-8 -*- s1 = 72 s2 = 85 print('小明的成绩提高了%.1f%%个百分 ... 
- Day 45 Mysql 数据库练习题二
		1.表关系 注意:创建表时,根据合理性设置字段的长度和类型. 2.下面:开始你的表演 1.查询所有人员信息 select * from ren 2.只查询人员的姓名和年龄 select name, ... 
随机推荐
- 20155209 2016-2017-2 《Java程序设计》第八周学习总结
			20155209 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从J ... 
- MathJax $TeX$ Test Page
			MathJax TeX Test Page When $a \ne 0$, there are two solutions to \(ax^2 + bx + c = 0\) and they are ... 
- 关于CI/CD/CD (Continuous Integration/Continuous Delivery/Continuous Deployment)
			Continuous Integration (CI) Continuous integration (CI) is the process that ensures the stability of ... 
- dorado-menu
			1.menu控件是一个下拉菜单控件,可以设置数icon(图标),click事件,Dorado事件中都有self和arg两个参数,其中self是当前控件本身 2.menu控件可以和toolBar结合使用 ... 
- Linq to sql中使用DateDiff()
			Linq to sql中使用DateDiff() 计算时间差的方法 第一种办法: from p in PurchaseLists where EntityFunctions.DiffDays(p.Cr ... 
- 这里给大家介绍一下通过 Wi-Fi 连接“慷慨捐赠”你的身份信息的七种方法.
			这里给大家介绍一下通过 Wi-Fi 连接“慷慨捐赠”你的身份信息的七种方法和反制措施. 本文作者:黑子小盆友 1.利用免费热点 它们似乎无处不在,而且它们的数量会在接下来四年里增加三倍.但是它们当中很 ... 
- echarts4 主题切换
			<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ... 
- Python小白学习之路(十)—【函数】【函数返回值】【函数参数】
			写在前面: 昨天早睡之后,感觉今天已经恢复了百分之八十的样子 又是活力满满的小伙郭 今日份鸡汤: 我始终相信,在这个世界上,一定有另一个自己,在做着我不敢做的事,在过着我想过的生活.-------宫崎 ... 
- vue2.0函数(箭头函数)的this作用域
			在做vue项目时用到了axios,但是发现axios请求之后的回调函数里this并不指向当前vue实例,从而导致浏览器报错. 出错代码及结果: created : function(){ axios. ... 
- 【BZOJ1069】【SCOI2007】最大土地面积
			题目大意:给定有n个点的点集,求该点集中任意四个点所构成的四边形中面积最大四边形的面积. 我们不难想到(不难yy出来),面积最大的四边形的四个顶点一定所给定的点集所构成的凸包上.我们求出给定点集的集合 ... 
