C语言经典面试题目(十三)

1、什么是C语言中的结构对齐和填充字节?为什么要进行对齐和填充操作?

在C语言中,结构体的成员在内存中的存储位置并不是按照顺序依次排列的,而是按照特定的对齐规则进行排列。结构体对齐和填充字节是为了提高内存访问效率和硬件对齐要求而进行的操作。

结构体对齐:

结构体对齐是指结构体成员在内存中的存放位置按照一定的规则进行排列,以保证结构体成员的访问效率和内存对齐要求。对齐规则通常是按照成员大小或者特定的对齐属性进行排列。

填充字节:

填充字节是指在结构体的成员之间插入的字节,以满足对齐要求。填充字节的大小取决于对齐规则和结构体成员的大小。

2、如何在C语言中实现图数据结构?

图是一种常见的非线性数据结构,由顶点和边组成。在C语言中,可以使用邻接矩阵或邻接表来实现图数据结构。

  1. 邻接矩阵:使用二维数组来表示图中的顶点之间的关系。
  2. 邻接表:使用链表或数组加链表的方式来表示图中的顶点和边。

以下是一个使用邻接矩阵表示图的简单示例:

#define MAX_VERTICES 100

typedef struct {
    int vertices[MAX_VERTICES][MAX_VERTICES];
    int numVertices;
} Graph;

void initGraph(Graph *graph, int numVertices) {
    graph->numVertices = numVertices;
    for (int i = 0; i < numVertices; i++) {
        for (int j = 0; j < numVertices; j++) {
            graph->vertices[i][j] = 0;
        }
    }
}

3、C语言中的字符编码有哪些常见的类型?如何进行字符编码的转换?

C语言中常见的字符编码类型包括ASCII码、UTF-8、UTF-16等。要进行字符编码的转换,可以使用相关的库函数,如 iconvwcstombsmbstowcs 等。

例如,可以使用 iconv 函数来进行不同字符编码之间的转换。以下是一个简单的示例:

#include <stdio.h>
#include <iconv.h>

int main() {
    char src[] = "Hello, 你好";
    char dst[100];
    
    iconv_t cd = iconv_open("UTF-8", "GBK"); // 将GBK编码转换为UTF-8编码
    if (cd != (iconv_t)-1) {
        size_t srcLen = sizeof(src);
        size_t dstLen = sizeof(dst);
        char *srcPtr = src;
        char *dstPtr = dst;
        if (iconv(cd, &srcPtr, &srcLen, &dstPtr, &dstLen) != -1) {
            printf("转换后的字符串:%s\n", dst);
        }
        iconv_close(cd);
    }
    
    return 0;
}

4、C语言中的文件定位函数有哪些?请列举几个常用的文件定位函数。

C语言中常用的文件定位函数包括:

  1. fseek:设置文件指针的位置。
  2. ftell:获取文件指针的当前位置。
  3. rewind:将文件指针重置到文件的起始位置。

以下是一个示例:

#include <stdio.h>

int main() {
    FILE *fp = fopen("test.txt", "r");
    if (fp != NULL) {
        fseek(fp, 0, SEEK_END); // 定位到文件末尾
        long fileSize = ftell(fp); // 获取文件大小
        rewind(fp); // 将文件指针重置到文件起始位置
        // 其他操作
        fclose(fp);
    }
    return 0;
}

5、如何在C语言中实现哈希表数据结构?

哈希表是一种常见的数据结构,用于存储键值对。在C语言中,可以使用数组和链表来实现哈希表。以下是一个简单的示例:

#define SIZE 100

typedef struct Node {
    int key;
    int value;
    struct Node *next;
} Node;

typedef struct {
    Node *buckets[SIZE];
} HashMap;

HashMap *createHashMap() {
    HashMap *map = (HashMap *)malloc(sizeof(HashMap));
    for (int i = 0; i < SIZE; i++) {
        map->buckets[i] = NULL;
    }
    return map;
}

int hashCode(int key) {
    return key % SIZE;
}

void put(HashMap *map, int key, int value) {
    int index = hashCode(key);
    Node *

node = (Node *)malloc(sizeof(Node));
    node->key = key;
    node->value = value;
    node->next = NULL;
    
    if (map->buckets[index] == NULL) {
        map->buckets[index] = node;
    } else {
        Node *temp = map->buckets[index];
        while (temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = node;
    }
}

int get(HashMap *map, int key) {
    int index = hashCode(key);
    Node *temp = map->buckets[index];
    while (temp != NULL) {
        if (temp->key == key) {
            return temp->value;
        }
        temp = temp->next;
    }
    return -1;
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值