C语言中的malloc申请内存失败的原因

C语言中的malloc申请内存失败的原因

今天在写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

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函数的相关知识,参照网上大神这个博客:

C语言之内存的申请malloc() 和释放free()

相关手记

bet体育365官网安全吗 掠夺者前哨站 (Pillager Outpost) - [MC]我的世界原版 (Minecraft) - MC百科
bet体育365官网安全吗 掠夺者前哨站 (Pillager Outpost) - [MC]我的世界原版 (Minecraft) - MC百科
365提款一直在审核 关于速冻冷库的那些事(一文读懂速冻库)
365bet手机在线 太空知识

太空知识

07-04 👁️ 3090
365提款一直在审核 世界杯历史上50大轶事(从疯狂进球到传世经典,揭秘足球世界的辉煌历程)
365提款一直在审核 《梦幻西游》神木林入口在哪里