0
点赞
收藏
分享

微信扫一扫

C语言面试100道题

1.请写出 bool flag 与“零值”比较的 if 语句

if(flag)
if(!flag)

2.请写出 float x 与“零值”比较的 if 语句

const float ESPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON))

3.请写出 char *p 与“零值”比较的 if 语句

if(p == NULL)
if(p != NULL)

4.以下为 Linux下的 32 位 C程序,请计算 sizeof 的值。

char str[] = “Hello” ;

char *p = str ;

int n = 10;

请计算 (1)sizeof (str ) = (2)sizeof ( p ) = (3)sizeof ( n )

(1) 6 数组求大小,连同字符后的\0也加上,并且*类型1*6=6
(2) 4 指针类型,在32位操作系统中指针类型大小位4,64位大小是8 
(3) 4 指针类型,在32位操作系统中指针类型大小位4,64位大小是8

4.

void Func ( char str[100]) 
{ 

…… ; 

}


请计算 sizeof( str ) = 4

str为数组,数组传参传的数组名也为地址,地址的大小和指针大小一致 4

5.

void *p = malloc( 100 );

请计算sizeof ( p ) = 4

6.

e) 一个有10个指针的数组,该指针是指向一个整型数的;  int *a[10];

f) 一个指向有10个整型数数组的指针 ;  int (*a)[10];

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数;   int(*a)(int);

h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数;int(*a[10])(int);

7.设有以下说明和定义:


typedef union 
{
  long i; 
  int k[5];
  char c;
} DATE;

struct data 
{ 
  int cat;
   DATE cow;
   double dog;
} too;

DATE max;

则语句 printf("%d",sizeof(too)+sizeof(max));的执行结果是:52

8.请问以下代码有什么问题

int main()
{
  char a;
  char *str=&a;
  strcpy(str,"hello");
  printf(str);
  return 0;
}

指针str没有分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指 地址。虽然可以正确输出结果,但因为越界进行内在 读写而导致程序崩溃。

9.请问以下代码有什么问题:

char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
修改后
char str[] = "AAA";
char* s = str;

①"AAA"是字符串常量,s是指针,指向这个字符串常量。

②数组内成员不能直接赋值

10.int (*s[10])(int) 表示的是什么啊

函数指针数组,每个指针指向一个int func(int param)的函数。

11.c和c++中的struct有什么不同

c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。

c++中 struct和class的主要区别在于默认的存取权限不同, struct默认为public,而class默认为privat

12.

void getmemory(char *p)
{
  p=(char *) malloc(100);
  strcpy(p,"hello world");
}
int main( )
{
  char *str=NULL;
  getmemory(str);
  printf("%s/n",str);
  free(str);
  return 0;
}会出现什么问题?

程序崩溃,getmemory中的malloc 没有返回动态内存p, free()对str操作很危险。

13.产生什么结果?为什么?

#include "stdio.h"
#include "string.h"

int main()
{
	char s[10];
	strcpy(s,"0123456789");
	return 0;
}

结果:段错误,因为数组长度为10,只能放下10个字符串,而"0123456789"字符串后面还有一个\0字符串,超过数组长度了。

14.数组和链表的区别

①存储方式不同:

数组是连续存储的,数组在创建的时候需要一整块的空间。

链表是链式存储,链表在内存空间中不一定是连续的。

数组一般创建在栈区,链表一般创建在堆区,再增加节点时需要new或malloc新节点,相较于数组长度不固定,自由度高。

②访问元素方式不同

数组可以通过下标随机访问,单向链表只能通过头结点从前向后访问链表中的元素。

③增删效率不同

数组在插入和删除的时候需要移动链表中的其他元素,时间复杂的为O(n)。

链表在进行插入删除时,找到要插入或删除的位置后,增删时间复杂度为O(1)。

当线性表进行大量的插入和删除的操作时建议使用链表,若主要对线性表及逆行查找操作,较少进行插入操作时建议使用数组。

15.会出现什么问题?打印结果是是多少?

void main()
{
  char aa[10];
  printf("%d",strlen(aa));
}

sizeof()和初不初始化,没有关系,

strlen()和初始化有关,打印结果值未知

16.

struct A
{
  char t:4;
  char k:4;
  unsigned short i:8;
  unsigned long m;
};

问sizeof(A) = ?

答案:1 + 1 + 2 + 4 = 8

17.求sizeof(name1)?

struct name1
{
  char str;
  short x;
  int num;
};

答案:1 + 1 + 2 + 4 =8

18.求sizeof(name2)?

struct name2
{
  char str;
  int num;
  short x;
};

答案:4 + 4 + 2 + 2 = 12

19.程序哪里有错误

wap( int* p1,int* p2 )
{
  int *p;
  *p = *p1;
  *p1 = *p2;
  *p2 = *p;
}

答案:第一个创建的指针变量p没有初始化,此时为野指针。

20.(void *)ptr 和 (*(void**))ptr的结果是否相同?其中ptr为同一个指针

答案:结果相同,因为*ptr对per进行解引用正好抵消per*。

21.

要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234;

那么要是想让程序跳转到绝对地址是0x100000去执行 ,应该怎么做?

答案:首先要将0x100000强制转换成函数指针,即*((void(*)())0x100000)();

22.运行Test函数会有怎样的结果

char *GetMemory(void)
{
  char p[] = "hello world";
  return p;
}
void Test(void)
{
  char *str = NULL;
  str = GetMemory();
  printf(str);
}

答案:可能是乱码,因为GetMemory返回的是”栈内存“的指针,该指针的地址不是NULL,但其原先的内容已经被清除,新内容不可知。

23.关于内存的思考问题,运行Test会出现什么结果

void GetMemory(char **p,int num)
{
  *p = (char *)malloc(num);
}
void Test(void)
{
  char *str = NULL;
  GetMemory(&str,100);
  strcpy(str,"hello");
  printf("%s\r\n",str);
}

答案:①输出hello      ②内存泄漏

24.运行Test会出现什么结果

void Test(void)
{
  char *str = (char *)malloc(100);
  strcpy(str,"hello");
  free(str);
  if(str !=NULL)
  {
    strcpy(str,"world");
    printf("%s\n",str);
  }
}

答案:经过free(str)之后,str就被释放了,if(str !=NULL)不起作用。

25.关键字volatile有什么含意? 并给出三个不同的例子。

答案:volatile含义:被volatile修饰过的变量表示不想在不经意间被修改,因此编译器在读取整个被修饰过的变量时,会重新读取这个变量的值,而不是使用在寄存器中保存的备份。

①并行设备的硬件寄存器。

②一个终端服务子程序中会访问到的非自动变量。

③多线程应用中被几个任务共享的变量。

26.嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点

嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点,在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯 粹的ANSI编译器。写代码去完成这一任务。

答案:访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。

int *ptr = malloc(sizeof(int));
ptr = (int *)0x67a;
*ptr = 0xaa55;

27.

头文件中的 ifndef/define/endif 干什么用?

答案:①防止同一个头文件重复包含。

头文件可能会从多个源文件中被包含。如果没有判断,每次包含都会重复定义它里面的内容,可能导致编译错误,使用#ifndef/#d,efine/#endif可以确保头文件只被定义一次。

         ②避免重复定义

头文件里可能定义了变量或类型等,重复定义就会导致编译错误。使用#ifndef可以避免这种情况。

          ③提高效率

只有在没有定义某个宏时,才会执行后续代码块。如果重复包含,就直接跳过后续代码,提高编译效率。

28.#include <filename.h>和#include “filename.h” 有什么区别

答案:主要区别在于它们引用的头文件搜索路径不同:

  • #include <filename.h>: 会在编译器预定义的系统头文件目录中搜索filename.h头文件。这些目录通常包含标准C/C++库头文件。
  • #include "filename.h": 会先在项目源代码所在目录中搜索filename.h头文件,如果没有找到,则在系统头文件目录中搜索。

所以:

  • 使用#include <filename.h>包括标准库头文件。
  • 使用#include "filename.h"包括项目本身定义的头文件。

总的来说:

  • #include <filename.h>用于标准库头文件
  • #include "filename.h"用于项目内部定义的私有头文件

29.const 有什么用途?(请至少说明两种)

①可以定义 const 常量

②const 可以修饰函数的参数、返回值,甚至函数

的定义体。被 const 修饰的东西都受到强制保护,可 以预防意外的变动,能提高程序的健壮性。

③防止函数或变量的值被改变。比如定义一个常量用const,可以保证其值不会被修改。

④修饰对象表明它是一个只读对象。如定义常量对象const对象,可以使对象的值在程序执行期间保持不变。

30.static有什么用途?

①static修饰全局变量变为静态全局变量,全局变量的作用域改变,生命周期不变,只能在其.c文件中背使用。

②static修饰局部变量变为静态局部变量,局部变量超过生命周期也不会被销毁,改变了局部变量的生命周期,但其作用域还是局部的。

③static修饰函数变为静态函数,函数只能在自己的.c内使用,不能在其他文件中使用。

31.堆栈溢出一般是由什么原因导致的?

答案:没有回收垃圾资源

①函数调用深度过深。

②栈内存分配过大。

③递归调用次数过多。

④没有清理临时变量。

⑤不合理的循环结构。如死循环、死递归。

32.如何引用一个已经定义过的全局变量?

可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在 头文件中声明的全局变量,假定你将那个变量写错了 ,那么在编译期间会报错,如果你用extern方式引用 时,假定你犯了同样的错误,那么在编译期间不会报错,而在链接期间报错。

33.全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么

可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全 局变量,前提是其中只能有一个C文件中对此变量赋初 值,此时链接不会出错

34.队列和栈有什么区别

①规则不同,队列遵循先进先出(First In First Out, FIFO)的原则,栈遵循先进后出(First In Last Out, FILO)的原则。

②遍历数据速度不同,队列可以通过地址指针进行遍历,可以从队列的头部或尾部开始遍历,但不能同时进行。遍历过程中不需要为数据开辟临时空间,因此遍历速度较快。

栈只能从栈顶取数据,如果要取栈底的数据,需要遍历整个栈,并且在遍历的同时需要为数据开辟临时空间,以保持数据在遍历前的一致性。因此,栈的遍历速度相对较慢。

35.Heap(堆)与stack(栈)的差别

①开辟方式不同,heap在堆区开辟,stack在栈区开辟。

②释放方式不同,heap由new或malloc动态开辟,需要手动free释放。

stack由cpu开辟和销毁的。

36.用宏定义写出swap(x,y),即交换两数

#define swap(x,y)
(x) = (x) + (y);
(y) = (x) - (y);
(x) = (x) - (y);

37.写一个“标准”宏,这个宏输入两个参数并返回较小的一个

#define Min(X,Y) ((X>Y)?(Y):(X))

38.带参宏与带参函数的区别(至少说出5点)

C语言面试100道题_整型

举报

相关推荐

0 条评论