(15题,45分钟,闭卷)
一、( 8 分 )请问以下程序输出什么结果?
char *getStr(void) 。
{
char p[] = "hellow world"; return p;
}
void test(void)
{
char *str = NULL; str = getStr(); printf("%s", str);
}
不会正确输出,可能会段错误。
二、( 5 分 )test2 函数有问题吗?如果有, 请指出问题出在什么地方并给出正确答案。
void test2()
{
char string[10], str[10];
int i;
for(i = 0; i < 10; i++)
{
str[i] ='a';
}
strcpy(string, str);
}
for(i = 0; i < 9; i++)
……
Str[9] = ‘\0’
……
没有\0结尾会导致strcpy无法结束。
三、(5分)用预处理指令#define声明一个常数,用以表明一年中有多少秒。(忽略闰年问题)
#define SECONDS_PER_YEAR (365 * 24 * 60 * 60)
四、( 5分 )写一个“标准”宏MIN , 这个宏输入两个参数并返回较小的—个。
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
五、( 8分 )你怎么样用 C 编写死循环呢?
While(1)
六、( 10分 )用变量 a 给出下面的定义 :
1、一个整型数 ;int a;
2、一个指向整型数的指针 ;int *a;
3、一个指向指针的指针,它指向的指针是指向一个整型数;int **a;
4、一个有 10 个整型数的数组;int a[10];
5、一个有 10 个指针的数组,该指针是指向一个整型数的;int *a[10];
6、一个指向有 10 个整型数数组的指针;int (*a)[10];
7、一个指向函数的指针,该函数有一个整型数参数并返回一个整数;int (*a)(int);
8、一个有 10 个指针的数组 ,该指针指向一个函数,该函数有一个整型参数并返回一个整型数。int (*a[10])(int);
七、( 5分 )关键字 static 的作用是什么?
Static意为静态变量,用于控制变量的作用域和生命周期,主要应用于变量和函数。
修饰外部变量或函数时可以限定当前变量的作用域为当前文件,在函数内部定义时会延长变量的生命周期。该变量只会在第一次进入作用域时被初始化,并且在整个程序的执行过程中保持其值。
八、( 10 分 )关键字 const 有什么含意?
const用于声明常量,即一旦初始化后就不能再被修改的变量。它可以应用于多种类型的数据,包括基本类型、指针和复合类型等。用于函数形参时可以确保函数不会修改其值,用于类中的函数时该函数不能修改类中的变量。
下面的声明都是什么意思?
1)const int a;
2)int const a;
3)const int *a;
4)int *const a;
5)int const *a const;
九、( 5 分 )下面的代码输出是什么?为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a - b > 6) ? puts(">6") : puts("<=6");
}
(a – b)是无符号数无论如何都是正数,而且非常大。所以>6
十、( 5 分 )动态分配内存可能发生的问题是什么?
内存泄漏:分配了内存但没有适时释放,导致程序占用的内存不断增加。
野指针:指向已经释放的内存的指针。使用野指针可能导致程序崩溃或未定义行为。
包括但不限于使用已释放的内存、重复释放同一内存块等。
内存越界:访问数组或其他数据结构时超出其实际大小,可能会破坏其他数据或导致程序崩溃。
分配失败:动态内存分配请求失败(如malloc返回NULL),而程序没有妥善处理这种情况。
内存碎片:多次分配与释放导致内存分割成小段,难以找到足够的连续内存空间来满足新的分配请求
十一、( 5 分 )volatile 这个关键字的作用是什么?
volatile 是易变的,volatile 的作用:
- 防止优化: 编译器在优化代码时可能会假设某些变量的值不会在两次访问之间发生变化。使用 volatile 关键字可以禁止这种优化,确保每次访问变量时都从内存中读取最新的值,而不是使用寄存器中缓存的值。
- 用于硬件交互: 在嵌入式系统或操作系统编程中,volatile 通常用于那些可能被硬件改变的变量,例如硬件寄存器、中断服务例程中的变量等。这样可以确保程序总是读取到最新的值。
- 应用于多线程环境: 在多线程环境中,volatile 可以用来标记那些可能被其他线程修改的变量。虽然 volatile 不能替代线程同步机制(如互斥锁),但它可以确保变量的可见性。
十二、( 8 分 )请写出下面的程序的输出结果 :
#include<stdio.h>
int main()
{
int a = 10, b, c, d;
b = a++;
c = ++a;
d=10*(++a);
printf(" b : %d ,c : %d , d :%d", b , c, d);
return 0;
}
b : 10 ,c : 12 , d :130
十三、(8分)进程之间进行通信的方式有几种,它们分别是什么?
管道,信号,消息队列,共享内存,信号量集,套接字等
十四、(5分)进程和线程的区别是什么?
进程是操作系统进行资源分配的基本单位,每个进程都有独立的内存空间和资源。进程之间的通信通常需要使用IPC机制。
线程是进程内的一个执行单元,同一进程内的线程共享资源。线程之间的通信相对简单,可以直接访问共享数据。创建和销毁线程的开销比进程小,上下文切换也更快。
十五、(8分)请列举四种位运算符,并说明它们一般用于什么地方。
算术运算符用于数学运算
关系运算符用于判断大小等
逻辑运算符用于与或非运算
位运算符用于二进制操作移位等等