C/C++基础知识10道题,你都会吗?

题目1:指针基础知识

题述:描述指针数组和数组指针(指向数组的指针)的区别并举例

考察点:C指针的基础知识

答案:考虑如下

char *q[] = {“xxx”, “xxx”, “xxx”}; 指针数组,q[0] 为一个指针

char (*p)[] = a; 数组指针,p[0] 为一个变量

时间:1min

题目2:内存分配

题述:描述c程序内存分配方式以及它们的区别(5分钟)

考察点:编程基础

参考答案:

1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。

2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。

3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定。

题目3:读程序找错

问题:【找错类】下面的程序用于读取整数,整数的范围在1和从标准输入读取的size之间,它返回每个值出现的次数,这个程序包含了几个错误,请指出。(10min)

#include <stdlib.h>

Int * frequency(int size)

{

Int *array;

Int i;

array= (int *)malloc(size *2);#获得足够的内存来容纳计数

#调整指针,让它后退一个整形位置,这样就可以使用范围1-size的下标

Array-=1;

#把各个元素清零

For(i=0;i<size;i++)

Array[i]=0;

#计数每个值出现的次数,然后返回结果

While(scanf("%d",&i) == 1) #scanf的返回值代表成功读入的个数

Array[i] +=1;

Free(array);

Return array;

}

错误点:

(1) 用字面值常量2作为整型值的长度,这个值在整型值长度为2个字节的机器上能正常工作,但在4字节整数机器上,实际分配的内存将只是所需内存的一半,所以应该用sizeof

(2) 从malloc函数返回值未被检查,如果内存不足,将返回NULL

(3) 把指针退到数组左边界的左边来调整下标的范围或许行得通,但它违背了标准关于指针不能越过数组左边界的规定。

(4) 指针经过调整后,第一个元素的下标变成了1,接着for循环将错误地从0开始。在许多系统中,这个错误将破坏malloc所使用的用于追踪堆的信息,常常导致程序崩溃

(5) 数组增值前并未检查输入值是否位于合适的范围内;

(6) 如果数组应该被返回,它就不能被free掉

题目4:读程序确认返回值

求函数返回值,输入x=9999;

int func(int x)

{

int countx = 0;

while(x)

{

countx ++;

x = x&(x-1);

}

return countx;

}

【问题】请写出该函数的返回值以及分析过程。(10分钟)

参考答案:8

解这道题的时候,如果拿出一个二进制数来分析就会容易的多了,x=x&(x-1)实际上就是把x的二进制形式的最后一个“1”变成“0”,x的二进制形式有多少个“1”循环就执行多少次。

9999/256 = 39 余 15,把这两个数分别转化一下就很快了

39 = 32 + 4 + 2 +1 = 00100111

15 = 0f = 00001111

所以 9999=0010011100001111,共有8个1,答案就是 8 了

考察点:c编程基础知识

题目5:实现strndup函数

请编写以下功能的函数:char *strndup(char *src, int n); 复制字符串src,返回新的指针地址,最多复制n个字节(包括字符串结束的'\0')。该题目的审查要点是:

l是否检查参数的有效性:src, n;

l是否能正确使用内存申请函数和指针;

l对于"最多复制n个字节"的要求考虑是否周到

题目6:合并两个有序链接

合并两个有序(升序)链接。

typedef struct _link_t

{

int val;

struct _link_t *next;

} link_t;

link_t* merge(link_t* ln1, link_t* ln2);

题目7

(本题答案不全):实现子序列最大和

给定一个int 数组,给出其中连续子序列的最大和

unsigned int foo(int *arr, size_t len);

例子1: 数组[-2,11,-4,13,-5,2]中具有最大累加和的子数组为[11,-4,13],其和为20;

例子2:[1, -3, 4, -2, -1, 6] 中具有最大累加和的子数组为[4, -2, -1, 6], 其和为7。

题目8

(本题答案不全):字符串排序

有一个由字母(大小写)组成的字符串,要求对其排序,要求效率尽可能高且辅助空间尽可能少。

实现 void sort(char* s); 返回写入s。

题目9

(本题答案不全):字符串反转

写代码反转一个字符串,要求交换的次数和辅助空间尽量少。

实现 void reverse(char* s);返回写入s。

题目10(本题答案不全):楼梯走法

走楼梯可以一次上1级,也可以一次上两级,请问上n级台阶有几种走法。n不超过10K,要求效率尽可能高。

实现 unsigned int count(unsigned int n);

 

相关文章: