【C++】 错题整理(一)

C++考试试题 04-27 成绩报告

单选题:

1.A* pa = new A[10];// 动态申请10个的空间 delete pa;
则类A的析构函数和构造函数分别执行了几次( )
[知识点遗忘]

A.10, 1
B.10, 10
C.程序崩溃
D.程序可能崩溃

我的回答:B(错误)
正确答案:C

● new T[N]的原理

  1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请。
  2. 在申请的空间上执行N次构造函数。

● delete的原理

  1. 在空间上执行析构函数,完成对象中资源的清理工作。
  2. 调用operator delete函数释放对象的空间。

● delete[]的原理

  1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。
  2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间。
    因此,题目中类A在申请自定义类型的空间时,new调用了十次构造函数,delete调用一次析构函数,运行时会导致程序崩溃。这里应该改为 delete [] pa。

2.int* p1 = (int*)malloc(sizeof(int)); int* p2 = p1;
以下说法正确的是( )
[知识点混淆]

A.p1指向的空间在堆上,p2指向的空间在栈上
B.p1指向的空间在栈上,p2指向的空间在堆上
C.p1指向的空间在堆上,p2指向的空间在堆上
D.p1指向的空间在栈上,p2指向的空间在栈上

我的回答:B(错误)
正确答案:C

● 堆栈空间分配区别:
  栈 :由操作系统自动分配释放 ,存放函数的参数值局部变量的值等。其操作方式类似于数据结构中的栈;
  堆 : 就是那些由new分配的内存段,一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

3.对于以下代码,下面说法正确的是( ) [新知识点]

class A
{
public:
void Function()
{
cout<<"I can run crocrectly"<<endl;
}
};
A* pa = NULL;
pa->Function();

A.编译失败
B.编译成功,在调用函数时崩溃
C.编译成功,函数在运行时崩溃
D.输出I can run correctly

我的回答:B(错误)
正确答案:D

● 此时,虽然this指针实参为NULL,但是fun函数根本没有用到this指针。空指针可以调用函数,只要不在成员函数里面显式/隐式的使用this 就行。这是因为C++里this实质是函数的最后一个参数,并没什么特别的。
但是,如果在成员函数中使用的成员变量,就不可避免要使用到this指针,若是这样,就不可避免的出现崩溃了。
综上所述:空指针仍然能调用成员函数,如成员函数为virtual(静态成员函数)的话,则一开始就会崩溃,不会调用进去。

4.给出下列程序的输出结果( ) [知识点混淆]

char* p1 = "prety-girl";
char p2[] = "prety-girl";
printf("%d %d %d %d", sizeof(p1), strlen(p1), sizeof(p2),strlen(p2));

A.4 10 4 10
B.4 10 10 10
C.4 11 10 10
D.4 10 11 10

我的回答:C(错误)
正确答案:D

strlen与sizeof的区别:
strlen:是C标准库中的字符串函数,用于统计字符的个数,不包括字符串结束符。
sizeof:是c语言中的运算符,确切的说是一个编译时运算符,用于统计类型或者变量所占的内存字节数,不是实际长度。

char* p1 = "prety-girl";
//sizeof(p1)值为4,因为p1是一个char类型的指针,占四个字节;
//strlen(p1)的值为10,因为"prety-girl"这个字符串有10个字符。

char p2[] = "prety-girl";
//sizeof(p2)值为11,因为p2中加上字符串结束符,共有11个char型的变量,每个char型占一个字节;
//strlen(p2)的值为10,计算的是字符串中的字符个数。

printf("%d %d %d %d", sizeof(p1), strlen(p1), sizeof(p2),strlen(p2));

5.以下程序的功能是( ) [知识点遗忘]

include<stdio.h>
int main(void)
{
FILE *fp;
long int n;
fp = fopen("wj.txt","rb");//以只读的方式打开二进制文件“wj.txt”
fseek(fp , 0 , SEEK_END);//定义指针到文件末尾
n = ftell(fp);//读取文件的长度
fclose(fp);
printf("%ld",n);
}

A.计算文件wj.txt内容的字节数
B.计算文件wj.txt的终止地址
C.计算文件wj.txt的起始地址
D.将文件指针定位到文件末尾

我的回答:B(错误)
正确答案:A

● fopen:函数原型:FILE * fopen(const char *path,cost char *mode)
作用:打开一个文件,返回指向该文件的指针
参数说明:第一个参数为要打开文件的文件路径及文件名,第二个参数表示对文件的打开方式。
注意在fopen操作后要进行判断,是否文件打开,文件真正打开了才能进行后面的读或写操作,如有错误要进行错误处理

● fread:函数原型:size_t fread(void* buff,size_t size,size_t count,FILE* stream)
作用:从文件中读入数据到指定的地址中
参数:第一个参数为接收数据的指针(buff),也即数据存储的地址
第二个参数为单个元素的大小,即由指针写入地址的数据大小,注意单位是字节
第三个参数为元素个数,即要读取的数据大小为size的元素个素
第四个参数为提供数据的文件指针,该指针指向文件内部数据
返回值:读取的总数据元素个数

● fseek:函数原型:int fseek(FILE stream,long offset,int framewhere)
作用:重定位文件内部的指针
参数:第一个为文件指针,第二个是指针的偏移量,第三个是指针偏移起始位置
返回值:重定位成功返回0,否则返回非零值
需要注意的是该函数不是重定位文件指针,而是
重定位文件内部的指针,让指向文件内部数据的指针移到文件中我们感兴趣的数据上,重定位主要是这个目的
说明:执行成功,则stream指向以fromwhere为基准,偏移offset个字节的位置。执行失败(比方说offset偏移的位置超出了文件大小),则保留原来stream的位置不变

● ftell:函数原型:long ftell(FILE *fp)
作用:用来返回当前文件指针的位置。
定义在stdio.h头文件中,返回当前文件指针位置,这个位置是当前文件指针相对于文件开头的位移量。
返回值:返回文件指针的位置,若出错则返回-1L

● fclose:函数原型:int fclose(FILE *stream)
作用关闭一个文件流,使用fclose就可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区

6.int main(){fork()||fork();}
共创建几个进程:( )
[未学到]

A.1
B.2
C.3
D.4
E.5
F.6

我的回答:D(错误)
正确答案:C
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
在这里插入图片描述
7.在Linux系统中, 为找到文件try_grep含有以a字母为行开头的内容, 可以使用命令?( ) [未学到]

A.grep -E #$ try_grep
B.grep -E #a try_grep
C.grep -E ^$ try_grep
D.grep -E ^a try_grep

我的回答:B(错误)
正确答案:D

8.写出完成以下功能的Linux命令:使用sed命令, 将文件xyz中的单词AAA全部替换为BBB ( ) [未学到]

A.sed ‘s/AAA/BBB’ xyz
B.sed ‘s/AAA/BBB/g’ xyz
C.sed ‘s/AAA/BBB/p’ xyz
D.sed ‘s/AAA/BBB/d’ xyz

我的回答:C(错误)
正确答案:B

● s表示替换命令, /AAA 表示匹配AAA, /BBB 表示把匹配替换成BBB,/g 表示一行上的替换所有的匹配,xyz 表示替换xyz文件中的xyz。
● g 表示行内全面(globe)替换。
● p 表示打印行。
● w 表示把行写入一个文件。
● x 表示互换模板块中的文本和缓冲区中的文本。
● y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)。
● \1 子串匹配标记 。
● & 已匹配字符串标记 。

9.在unix系统下执行chmod(“/usr/test/sample”,0753)之后该文件sample的访问权限为( ) [知识点混淆]

A.拥有者可读写执行,同组用户可写可执行,其他用户可读可执行
B.拥有者可读写执行,同组用户可读写,其他用户可读可执行
C.拥有者可读写执行,同组用户可读可执行,其他用户可写可执行
D.拥有者可读写执行,同组用户可读可执行,其他用户可读写

我的回答:D(错误)
正确答案:C

● 说明:Linux/Unix 的文件调用权限分为三级:文件拥有者[属主]、属组、其他用户。利用chmod可以控制文件如何被他人所调用。
u表示该文件的拥有者[user],
g表示与该文件的拥有者属于组(group),
o表示其他用户[other],
a表示这三者皆是[all]。(常用)
+表示增加权限、(常用)
-表示取消权限、(常用)

=表示唯一设定权限。

取权限:r=4(二进制100),
入权限:w=2(二进制010),
执行或切换权限:x=1(二进制001)

综上所述:/usr 7(0111): 文件拥有者具有 可读可写执行权限,
/test 5(0101):同组用户拥有 可读可执行权限,
/sample 3(0011):其他用户拥有 可写可执行权限。

10.在bash中,在一条命令后加入”1>&2”意味着( ) [未学到]

A.标准输出重定向到标准错误输出
B.标准输入重定向到标准错误输出
C.标准输出重定向到标准输入
D.标准错误输出重定向到标准输入

我的回答:B(错误)
正确答案:A

11.若一棵二叉树的前序遍历序列和后序遍历序列分别为1, 2, 3, 4 和 4, 3, 2, 1,则该二叉树的中序遍历序列不会是( )。 [粗心错误]

A.1, 2, 3, 4
B.2, 3, 4, 1
C.3, 2, 4, 1
D.4, 3, 2, 1

我的回答:A(错误)
正确答案:C,C选项中左结点3比2还大,不符合二叉树的规则。

12.一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足?( ) [可能性考虑不全面]

A.所有的结点均无左孩子
B.所有的结点均无右孩子
C.只有一个叶子结点
D.是一棵满二叉树

我的回答:B(错误) 结点全在左树或者右树不作为判断此条件的依据。
正确答案:C

13.给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的平均时间复杂度
是:( )
[考虑错误]

A.O(n)
B.O(nlogn)
C.O(n^2)
D.O(logn)

我的回答:D(错误)
正确答案:A,二分查找时间复杂度为(O(lgn)或O(n)),以sum/2为中间值进行二分查找,找到与sum/2最接近的整数,如果其小于sum/2则与其右边一个数的和最接近sum,反之则与左边第一个数的和最接近sum。

二分查找实现思路:假设有一升序的数据集合,先找出升序集合中最中间的元素,将数据集合划分为两个子集,将最中间的元素和关键字key进行比较,如果等于key则返回,如果大于关键字key,则在前一个数据集合中查找,否则在后一个子集中查找,直到找到为止,如果没找到则返回-1。

14.下列排序算法中,在待排序数据已有序时,花费时间反而最多的是( )排序。 [题目不严谨]

A.冒泡
B.希尔
C.快速
D.堆

我的回答:D(错误) 堆在调整的过程中花费的时间不太多。
正确答案:C (指的是未优化过的快速排序)

15.下面程序的输出是:( ) [知识点混淆]

char s[] = "Welcometohengtian";
printf("%s %d",s+7,sizeof(s));

A.Welcometohengtian17
B.tohengtian 18
C.tohengtian 17
D.Welcometohengtian18

我的回答:C(错误)
正确答案:B

16.将一颗有100个结点的完全二叉树从根这一层开始,进行广度遍历编号(从1开始编号),那么编号最小的叶节点
的编号是 ( )
[计算错误]

A.49
B.50
C.51
D.52

他的回答:B(错误) 完全二叉树第n层有2^(n-1)个结点,n层共有(2 ^n) -1个结点。计算得共有50个叶子结点,所以编号从51~100。
正确答案:C

补充:设某种二叉树有如下特点:每个结点要么是叶子结点,要么有2棵子树。假如一棵这样的二叉树中有
m(m>0)个叶子结点,那么该二叉树上的结点总数为( )
A.2m+1
B.2m-1
C.2(m-1)
D.2m
他的回答:B(正确)
正确答案:B

不定项选择

1.在Linux上,对于多进程,子进程继承了父进程的下列哪些?( ) [未学到]

A.进程地址空间
B.共享内存
C.信号掩码
D.已打开的文件描述符
E.都不是

我的的回答:BD(错误)
正确答案:BCD

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值