30. 用变量a给出下面定义
由于题目没有提供具体的定义,这里给出几个常见的变量定义示例:
整数变量 :int a;字符变量 :char a;浮点变量 :float a;双精度浮点变量 :double a;指针变量 :int *a;
31. 数组和链表的区别?
数组和链表是两种常见的数据结构 ,它们有以下主要区别:
内存布局 :
数组:连续内存块。 链表:分散内存块,节点通过指针链接。 访问方式 :
数组:随机访问,时间复杂度为O(1)。 链表:顺序访问,时间复杂度为O(n)。 插入/删除 :
数组:需要移动元素,时间复杂度为O(n)。 链表:不需要移动元素,时间复杂度为O(1)(前提是已找到插入/删除位置)。 内存使用 :
数组:大小固定,声明时分配。 链表:动态分配,根据需要增加或减少。 缓存友好性 :
数组:缓存友好,连续存储。 链表:缓存不友好,节点分散。
32. 堆栈的溢出一般是由什么原因造成的(至少说出三个)?
堆栈溢出 通常由以下原因引起:
递归过深 :未达到基准条件或条件错误,导致无限递归。大数组或变量 :在栈中分配过大数组或局部变量,超出栈空间。无限循环 :导致函数调用或栈操作不断增加。
33. 不使用第三方变量交换变量a和b的值?
可以使用算术运算或位运算交换两个变量的值:
使用算术运算:
a = a + b;
b = a - b;
a = a - b;
使用位运算:
a = a ^ b;
b = a ^ b;
a = a ^ b;
34. 带参宏与带参函数的区别(至少说出5点)?
编译时机 :
类型检查 :
调试 :
宏:难以调试,错误信息指向宏定义处。 函数:易于调试,错误信息指向函数调用处。 代码大小 :
宏:每次展开增加代码大小。 函数:函数体只在内存中存储一份。 作用域 :
宏:无作用域概念。 函数:有作用域,局部变量和全局变量分隔。
35. 指针和引用的区别(C和C++中的问题)?
定义方式 :
指针:int *ptr = &var; 引用:int &ref = var; 是否可为空 :
指针:可以为NULL。 引用:必须初始化,不可为空。 重新绑定 :
指针:可以改变指向的对象。 引用:一旦绑定,无法改变指向对象。 使用方式 :
指针:需要解引用操作*ptr。 引用:直接使用,不需要解引用。 内存地址 :
指针:存储对象的地址。 引用:与对象共享相同的内存地址。
36. 结构体和共用体的区别?
内存布局 :
结构体:每个成员都有独立的内存空间,内存总大小是所有成员大小之和。 共用体:所有成员共享相同的内存空间,内存总大小是最大成员的大小。 用途 :
结构体:适用于需要同时访问多个成员的场景。 共用体:适用于多个成员互斥使用的场景。 访问方式 :
结构体:可以同时访问多个成员。 共用体:任一时刻只能访问一个成员,修改一个成员会影响其他成员。
37. 大端与小端的概念?写个函数判断机器是大端还是小端模式?
大端(Big Endian) :高位字节存储在低地址。小端(Little Endian) :低位字节存储在低地址。
判断函数:
# include
int is_little_endian ( ) {
unsigned int x = 1 ;
return * ( ( unsigned char * ) & x) == 1 ;
}
int main ( ) {
if ( is_little_endian ( ) ) {
printf ( "Little Endian\n" ) ;
} else {
printf ( "Big Endian\n" ) ;
}
return 0 ;
}
38. 在1G内存的计算机中能否malloc(1.2G)?为什么?
不能。在1G内存的计算机中,试图分配1.2G的内存将失败,因为系统没有足够的物理内存和虚拟内存来满足这个请求。
39. 设置地址为0x67a9的整型变量的值为0xaa66
在C语言中,通过指针可以直接操作内存地址:
int * ptr = ( int * ) 0x67a9 ;
* ptr = 0xaa66 ;
C语言笔试题
1. 森林中一样高的树
没有明确题意的情况下,假设是寻找数组中相等的元素,可以用哈希表或排序加双指针实现。
2. strcat、strncat、strcmp、strcpy哪些函数会导致内存溢出?如何改进?
strcat 和strcpy 容易导致内存溢出,因为它们不检查目标缓冲区大小。strncat 和strncmp 提供了长度限制,可以避免溢出。
改进:
使用strncat和strncpy代替strcat和strcpy。 确保目标缓冲区足够大,避免溢出。
3. 用变量a给出下面的定义
由于题目未明确定义,这里给出几个常见定义:
整数变量:int a; 字符变量:char a; 浮点变量:float a; 双精度浮点变量:double a; 指针变量:int *a;
通过理解和掌握这些面试题,可以更好地准备编程面试,展示对编程原理和技术细节的深刻掌握。