1.报此警告的意思是,在同一块中的非声明之后不能有声明。请把所有的声明变量放在函数的所有的初始化之前。
2.编码误区,C中64位系统的指针大小就是8字节,申请的结构体指针必须按照如下格式进行置空操作。
typedef struct information{
int a;
char b;
...
} Info, *INFO;
struct information *in = (struct information*)malloc(sizeof(struct information));
错误做法:memset(in, 0x00, sizeof(in)); !!!!! in是个指针,8字节,初始化并不彻底,内核模块编译报警告。
正确做法:memset(in, 0x00, sizeof(Info));
3.链表中的结构体指针问题
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <string.h>
typedef struct information{
int a;
int b;
struct information *prev;
struct information *next;
} Info, *INFO;
//注意与内核的宏container_of(用于通过给出的一个结构体定义和已经实例化的结构体其中一个变量,顺藤摸瓜找出此实例化的结构体首地址)的使用情景相区分
//内存释放就省略了,注意free节点后头指针并不指向NULL
/*与下面的写法区别(区别就是没有区别,至少在下面这种用法的时候):
typedef struct information{
struct information *prev;
struct information *next;
int a;
int b;
} Info, *INFO;
*/
/*
在创建链表使用malloc、kazlloc等函数申请空间的时候两种写法中的prev和next都是“野”指针,
即没有具体指向的指针,只有在添加到链表中的时候,才会给出指向:
当前节点的next会指向下一个链表节点的首地址
下一个节点的prev指向上一个节点的首地址
那么在一个链表中,打印前一个节点的“首地址”的值应该与当前节点的prev指针中存放的地址相同,
且前一个指针的next指针中存放的地址应该与当前指针的首地址相同
可以做如下验证:
*/
void showLink(INFO head){
assert(NULL != head);
INFO temp = head->next; //定义一个指针指向头节点的下一个节点的首地址,注意,这里并不是下一个节点的prev!!!
printf("下一节点的首地址\n");
printf("head->next=[%p]\n", head->next);//打印指针中存放的地址
printf("temp------=[%p]\n", temp );//打印下一个节点的首地址
printf("当前节点的首地址\n");
printf("temp->prev=[%p]\n", temp->prev);//打印下一个节点的prev地址
printf("head------=[%p]\n", head );//打印当前节点的首地址
}
int main(){
INFO head = NULL;
int i;
//create a link
for(i=0; i<10; i++){
INFO new_node = (INFO)malloc(sizeof(Info));
memset(new_node, 0x00, sizeof(Info));
if(NULL == head){
head = new_node; //head存放的是node节点的首地址,而不是node节点的prev的地址
new_node->prev = NULL;
new_node->next = NULL;
}else{//头插法
new_node->prev = NULL;
new_node->next = head;
head->prev = new_node;
head = new_node;
}
}
showLink(head);
return 0;
}