本文主要记录c语言编码过程中的一些注意事项。
1 C语言编码注意事项
1.1 申请的动态内存一定要做初始化工作
例如:如下所示的代码,若未对table->bucket指针数组赋初值,该数组中就有可能存在非法值,导致代码访问到非法内存。
1
2
3
4
5
6
7
8
9
10
11
12
|
int initHashTable(HashTable* table, int bucket_num)
{
table->bucket_num = bucket_num;
table->bucket = (HashNode**)malloc(sizeof(HashNode*) * bucket_num);
if (table->bucket == NULL) {
printf("Alloc memory failed.\n");
return -1;
}
// 此处一定要做初始化工作,否则可能存在非法内存访问的情况
memset(table->bucket, 0, sizeof(HashNode*) * bucket_num);
return 0;
}
|
1.2 对结构体变量初始化时,需要初始化所有的变量
实例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
struct ListNode {
int val;
struct ListNode *next;
};
ListNode* initNode(int val)
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
if (node == NULL) {
return NULL;
}
node->val = val;
// 注意此处一定要初始化,否则有可能访问到非法内存
node->next = NULL;
}
|
2 c语言编译相关
2.1 C语言使用asan的方法
C语言使用asan的方法:
- 环境安装和gcc版本对应的libasan版本。
- 编译代码时添加
-fsanitize=address
参数。
例如:
1
|
gcc -Wall -g -std=c99 -fsanitize=address lru.c -o lru
|
备注:ubuntu系统中不同asan版本和gcc的对应关系。
- libasan0: gcc-4.8
- libasan2: gcc-5
- libasan3: gcc-6
- libasan4: gcc-7
- libasan5: gcc-8