malloc ,extern与结构体,结构体指针

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 
#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,这个操作是一对一的。

你可能感兴趣的:(数据结构,c++,开发语言)