1.结构体,结构体指针不能被声明为外部变量,会出现无法解析的错误
2.结构体,结构体指针声明必须放在使用到该结构体的对应的函数内
3.使用结构体指针时需要使用malloc
以下是测试代码:
#pragma once
#ifndef _STRUCT_H
#define _STRUCT_H
typedef struct node *Node; //给结构体指针取别名,别名为Node,指针Node可以指向任意现有的node类型数据结构
struct node {
int column;
int row;
float data;
};
typedef Node matrix; //结构体指针别名的别名
//extern matrix temp1,temp2; //结构体指针extern无效,会有无法解析错误,
//node temp3; //无效的声明,放在头文件中会出现重定义错误,声明必须放在使用到该结构体的对应的函数内
Node test(void);
#endif // !_STRUCT_H
#include "pch.h"
#include <iostream>
#include "struct.h"
Node test(void) {
//matrix temp1, temp2;
Node temp1; //声明放在对应的函数内
node temp3;
temp1 = (Node)malloc(sizeof(struct node));
temp1->column = 10;
temp1->row = 12;
temp1->data = 1.33;
temp3.column = 13;
printf("%d", temp1->column);
return temp1;
}
以下解释来自:(10条消息) 【数据结构】使用结构体指针时需要使用malloc_enchantedovo的博客-CSDN博客_结构体指针为什么malloc
如果定义一个结构体类型的普通变量,可以不malloc动态申请内存,CPU会为这个结构体变量分配内存
如果定义的是一个结构体的指针,CPU会为这个指针开辟内存,但是此时这个大小是4(如果是32位的CPU的话),所以这个空间不足以存储结构体的数据成员,就会引发错误,此时必须要malloc申请一个,结构体类型大小的动态内存,用于数据成员存储使用
拓展一下,malloc是动态申请,调用后会根据虚拟映射表去找物理内存,此时内核会先产生一个请求内存异常,然后根据这个异常再去为程序分配malloc的内存
另外注意,调用malloc后一定要free,且在free掉之后要赋值NULL,这个操作是一对一的。