今天在写C语言的时候,发现一个malloc函数的返回值总是NULL,无法申请内存,导致异常:读取位置时候发生访问冲突。
查询了很多解决方法,在此归纳一下malloc函数无法分配内存的原因:
- 内存不足(个人认为目前的代码量对比计算机的内存性能还不够出现这样的错误)
- 前面程序使用malloc函数时候发生了内存访问越界,即前面的malloc相关函数调用出现问题,导致接下来的malloc函数分配内存时候发生信息错误,无法正常调用
问题:
对于本次写的代码,首先构建了两种结构体:
//定义顶点结构
typedef struct gnode *ptrtognode;
struct gnode
{
int Nv;//顶点个数
int Ne;//边数
weighttype weight[MAX][MAX];//定义邻接矩阵
};
typedef ptrtognode Mgraph;//定义的邻接矩阵
//定义边结构
typedef struct edge *ptrtoedge;
struct edge
{
vertex v1, v2;
weighttype weight;
};
typedef ptrtoedge Edge;
在定义结构体变量,使用malloc分配内存的时候,一开始定义如下:
Mgraph M;
M = (Mgraph)malloc(sizeof(ptrtognode));
......
Edge e;
e = (Edge)malloc(sizeof(ptrtoedge));
......
程序在运行到第二个malloc后,会返回NULL,之后如果给该变量赋值,就会发生访问冲突,研究了很久也不知道怎么回事,后来突然发现为了偷懒在sizeof()函数中取的是结构体指针的变量大小,而不是结构体的变量大小,这样第二次的malloc函数就会出现问题。
问题解决:
将上述代码改为:
Mgraph M;
M = (Mgraph)malloc(sizeof(struct gnode));
......
Edge e;
e = (Edge)malloc(sizeof(struct edge));
......
问题解决!
这里意识到:结构体指针的大小与结构体的大小是不一样的,可以看下面这个程序:
#include<stdio.h>
typedef struct a *ptrtoa;
struct a
{
int n1, n2;
};
typedef ptrtoa A;
int main()
{
printf("%d %d %d\n", sizeof(struct a), sizeof(ptrtoa), sizeof(A));
return 0;
}
程序的输出结果为:
8 4 4
另外关于更多有关malloc函数的相关知识,参照网上大神这个博客: