C语言面试题30至39题

简介: . 用变量a给出下面的定义由于题目未明确定义,这里给出几个常见定义:整数变量:int a;字符变量:char a;浮点变量:float a;双精度浮点变量:double a;指针变量:int *a;通过理解和掌握这些面试题,可以更好地准备编程面试,展示对编程原理和技术细节的深刻掌握。

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 <stdio.h>

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哪些函数会导致内存溢出?如何改进?

  • strcatstrcpy容易导致内存溢出,因为它们不检查目标缓冲区大小。
  • strncatstrncmp提供了长度限制,可以避免溢出。

改进:

  • 使用strncatstrncpy代替strcatstrcpy
  • 确保目标缓冲区足够大,避免溢出。

3. 用变量a给出下面的定义

由于题目未明确定义,这里给出几个常见定义:

  • 整数变量:int a;
  • 字符变量:char a;
  • 浮点变量:float a;
  • 双精度浮点变量:double a;
  • 指针变量:int *a;

通过理解和掌握这些面试题,可以更好地准备编程面试,展示对编程原理和技术细节的深刻掌握。

相关文章
|
25天前
|
存储 安全 编译器
C语言面试题1-10
指针声明后立即初始化。 内存释放后将指针置为NULL。 避免越界访问。 10. 一个指针变量占几个字节? 一个指针变量的大小与系统和编译器相关。在32位系统中,指针变量占4个字节;在64位系统中,指针变量占8个字节。 通过深入了解以上问题,能够更好地掌握C语言内存管理的核心概念,提高编写高效、安全代码的能力。
23 1
|
25天前
|
存储 安全 编译器
C语言面试题11至20题
在C语言中,可以使用以下方式实现循环: for循环:用于确定次数的循环。 for (int i = 0; i < 10; i++) { // 循环体 } while循环:用于条件控制的循环。 while (condition) { // 循环体 } do-while循环:至少执行一次的条件循环。 do { // 循环体 } while (condition); 通过深入理解这些面试题,可以更好地准备编程面试,展示对编程原理和技术细节的深刻掌握。
18 3
|
2月前
|
存储 算法 C语言
从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
19 5
|
2月前
|
存储 编译器 C语言
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(下)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
38 1
|
2月前
|
存储 编译器 Linux
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(中)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
41 1
|
2月前
|
编译器 C语言 C++
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(上)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
22 0
|
2月前
|
编译器 程序员 C语言
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题(下)
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题
20 0
|
2月前
|
编译器 C语言 C++
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题(中)
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题
32 0
|
2月前
|
存储 程序员 编译器
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题(上)
从C语言到C++⑨(第三章_C&C++内存管理)详解new和delete+面试题笔试题
31 0
|
7天前
|
Java C语言 C++
定义C语言的int main()函数
定义C语言的int main()函数