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, ...
随机推荐
- android Qzone的App热补丁热修复技术
转自:https://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=400118620&idx=1&sn=b4fdd5055731 ...
- DelphiXE10.2怎么安装文本转语音(TTS)语音转文本(SR)控件(XE10.2+WIN764)
关资料: http://edn.embarcadero.com/article/29583 http://blog.sina.com.cn/s/blog_53866d7501017r1o.html 问 ...
- 【WP8.1】页面的导航效果
<Page.Transitions> <TransitionCollection> <NavigationThemeTransition> <CommonNa ...
- SQL SERVER 2008 附加数据库出现只读问题。
问题描述 在附加数据库时出现的图片: 解决办法 步骤一,修改文件夹的 1.打开该数据库文件存放的目录或数据库文件的属性窗口,选择"属性"菜单->选择"安全&qu ...
- MySQL远程连接失败,MySQL远程连接出现Using password:YES错误的解决办法
相信很多实用MYSQL的朋友都遇到过这种问题,就是MySQL使用localhost能够连接成功,但是使用IP连接却出现Using password:YES或者其它的连接错误.今天就把解决方法给大家说一 ...
- Ajax 访问 或 获取 IIS 虚拟目录
使用场景 最近用 .net core mvc 写了一个工具类的项目,作为我们项目的后台管理网站使用.第一次被老大拿去部署的时候被告知不可用,同样的代码在我电脑和我的iis上都可以使用的啊. 后来才知道 ...
- LoadRunner 12下载和安装教程
我们利用LoadRunner可以对Web应用系统进行性能压力测试,本篇博客将和大家介绍下LoadRunner 12的下载和安装,在后续的博客中将和大家介绍其使用的方法. 1.LoadRunner 12 ...
- C# volatile 关键字
volatile 就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier).它是被设计用来修饰被不同线程访问和修改的变量.如果不加入volatile,基本上会导 ...
- php不用递归完成无限分类,从表设计入手完整演示过程
无限分类是什么就不废话了,可以用递归实现,但是递归从数据库取东西用递归效率偏低,如果从表设计入手,就很容易做到网站导航的实现,下面是某论坛导航,如下图 网上无限分类大多不全面,今天我会从设计表开始, ...
- 微信小程序支付C#后端源码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...