一、选择题(25)

1.实现运行时多态要使用(C)

A.构造函数 B.析构函数 C.虚函数 D.重载函数


2.在C++中,数据封装要解决的问题是(B)

A.数据高速转换

B.切断了不同模块之间的数据的非法使用

C数据规范化排列

D.避免数据丢失


3.算法的时间复杂度是指(C)

A.执行算法程序所需要的时间

B.算法程序的长度

C算法执行过程中所需要的基本运算次数

D.算法程序中的指令条数


4.执行语句printf”%x”-1),后输出结果是(D)

A.-1
B.-ffff

C.1
D.ffff


5.数组定义为 int a[2][3]={1,2,3,4,5},数组元素值为1的是()

A.a[1][2]

B.a[1][1]

c.a[2][3]

D.a[0][0]

填空题(20分)

1.给定结构体

struct token_t{
char digit;
char index;
unsigned short data;
unsigned long tick;
};

则sizeof(token_t)=8

解析:char是1字节,unsigned short是 2字节,unsigned long是4字节。所以一共是1+1+2+4=8;

规则:需要字节对齐,使得内存访问速度提升。

  • 成员变量存放位置一般是成员变量大小的倍数。

  • 结构体的总大小是最大成员大小的整数倍。

  • 声明的先后顺序对大小也有影响。(以32位的编译器举例子)

#include<iostream>
using namespace std;
struct A{
char a; // 1字节
int b; // 4字节
short c; // 2字节
};
struct B{
double a;
char b;
int c;
};
struct C{
char b;
double a;
int c;
};
int main()
{
cout<<sizeof(A)<<endl;// 12
cout<<sizeof(B)<<endl;// 16
cout<<sizeof(C)<<endl;// 24
}

结构体A

结构体B

结构体C

2.程序的局部变量存在于()中,全局变量存在于(静态数据区/全局数据区)中动态申请数据存在于()中。

3.已知一个数组 array,用一个宏定义,求出数组的元素个数

#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))

4.char str[10];
strcpy(str,"0123456789")

产生什么结果?为什么?

解析:strcpy源码如下

#include <stdio.h>
char* strcpy(char* destination, const char* source) {
char* ptr = destination;
while (*source != '\0') {
*ptr = *source;
ptr++;
source++;
}
*ptr = '\0'; // 添加字符串结尾的 null 字符
return destination;
}
int main() {
char str1[20];
const char* str2 = "Hello, world!";
strcpy(str1, str2);
printf("%s\n", str1); // 输出:Hello, world!
return 0;
}

所以虽然source的大小为11,str表示管理缓冲区大小为10的指针,但是还是可以运行,不过会导致缓冲区溢出,这是一种常见的安全漏洞。此时str的值变为”0123456789“。注意:char str[10]=”0123456789”;会在编译期间就报错了。

三、简答题,写出程序执行结果,并解释原因(10 分)

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
void getstr(char *p)
{
p=(char *)malloc(100);
strcpy(p,"Tensun");
}
int main()
{
char *str;
getstr(str);
if( str){
str[6]=0;
printf("%s,%d",strlen(str));
free( str);

}
return 0;
}

解析getstr是值传递,不会改变str,对str条件检查后,访问str[6],这是一种未定义的行为,可能会导致程序崩溃。注意:printf(“%s”,str)时,因为未初始化,结果为(null)

MarkDown换行

  1. html换行标签: <br/>

  2. 使用&nbsp;(全称是 non-breaking space,表示非断空行)

    • 注意使用分号;

    • 只有在编辑区的空白行才能起到换行的作用,否则只是起到一个空格的作用。