ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]警告问题及双向链表的地址问题

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值