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, ...
随机推荐
- HDU1078 FatMouse and Cheese(DFS+DP) 2016-07-24 14:05 70人阅读 评论(0) 收藏
FatMouse and Cheese Problem Description FatMouse has stored some cheese in a city. The city can be c ...
- How To Use XDOLoader to Manage, Download and Upload Files? (文档 ID 469585.1)
Applies to: BI Publisher (formerly XML Publisher) - Version 5.6.3 to 5.6.3 [Release 5] Information ...
- Windows / Windows Phone 8.1 预留应用名称及应用上传
最近比较懒好久没有来这里跟大家聊了,WP 8.1 的 preview 发布已经有一阵子了,并且商店支持 8.1 应用也有一段时间了.我就把这篇 8.1 的应用商店预留提交作为 8.1 的一个开始吧. ...
- .NET 调试入门(二) dump 出程序数据
前言 有时候我们需要看程序中运行情况怎么,如:某对象字段的具体值是多少等问题,我们就可以用调试工具找到答案.我们还是沿用前面的程序.原代码在文章低部. dump栈上的值 在线程4中输 ...
- net 串口通讯 网口通讯(Socket)
1.串口通讯 2.网口(Socket) 源码下载:源码附件
- Asp.Net Web Api中使用Swagger
关于swagger 设计是API开发的基础.Swagger使API设计变得轻而易举,为开发人员.架构师和产品所有者提供了易于使用的工具. 官方网址:https://swagger.io/solutio ...
- WPF 自定义下拉列表
XAML代码: <Popup x:Name="popupStrategy" StaysOpen="False" PopupAnimation=" ...
- 双缓冲队列解决WPF界面卡死
工作中的项目,CS客户端会通过MQ接收前端设备发送的信息,之前测试的时候,由于测试的数据不大,没有进行压力测试,软件可以正常工作,随着项目现场设备数量的增加,CS客户端从MQ中订阅的数据量不断增加,最 ...
- 什么是fortran语言之fortran语言入门
Fortran源自于“公式翻译”(英语:FormulaTranslation)的缩写,是一种编程语言.它是世界上最早出现的计算机高级程序设计语言,广泛应用于科学和工程计算领域.FORTRAN语言以其特 ...
- [LeetCode] Minimum Number of K Consecutive Bit Flips 连续K位翻转的最小次数
In an array A containing only 0s and 1s, a K-bit flip consists of choosing a (contiguous) subarray o ...