C语言结构体指针陷阱

一、“.”和“->”区别:

当声明一个结构体时,因为自动分配了结构体的内存空间,所以可以直接用“.”访问相应结构体内的存储单元,比如:

typedef struct Node{
    int value;
}node;

node o;
o.value=2;

但如果声明的是一个结构体指针,则需要手动开辟一个结构体内存后,将这个指针指向该内存块后,再使用“->”进行内部变量访问,同时 (*o).value 等价于 o->value。

node *o;
o->value=2;

二、指向结构体的指针必须初始化:

#include <stdio.h>

typedef struct Node{
    int value;
}node;

int main(){
    node *o;
    o->value=2;
    printf("%d",o->value);

    return0;
}

这段代码编译没问题,运行却出错,为什么呢?
       定义了一个结构体指针o用来指向一个node结构体,但是你却没有给他赋值,系统只知道“o应该是一个node结构体内存单元的首地址”,但是地址是多少呢,还没有分配,所以此时o的值为NULL,*o指向的是一个空或者随机的内存空间,常说的“野指针”。所以p->a=1这句就会出错。 所以我们应该给o进行初始化,初始化有两种方式。
       一种是malloc动态分配内存:

o=(node *)malloc(sizeof(node));
o->value=2;

另一种是将o指向一个已经存在的node结构体:

node r;
o = &r;
o->value=2;//因为o为指针,所以此时其实为r的value被赋值为2
发布了4 篇原创文章 · 获赞 0 · 访问量 62

猜你喜欢

转载自blog.csdn.net/qq_40285768/article/details/104607834