malloc申请内存时出现堆已损坏

       在写程序过程中遇到malloc申请内存时出现错误,错误如下:

0x77C1E8FB (ntdll.dll) (Graph.exe 中)处有未经处理的异常: 0xC0000374: 堆已损坏。 (参数: 0x77C54270)

经过反复查看代码,发现问题,问题代码简化如下:

struct graphAdjList
{
AdjList adjList;
int numVertexes, numEdges;
};

typedef graphAdjList *GraphAdjList;

(*GL) = (GraphAdjList)malloc(sizeof(GraphAdjList));

int *stack;

stack = (int *)malloc(sizeof(int));

       程序调试过程中,在第一个malloc代码处没出现错误,但是到了第二个malloc时就提示上面的错误,仔细观察会发现,真正引起错误的其实是第一个malloc。

       因为在申请大小的时候,用的是GraphAdjList,而这个是graphAdjList 的指针,也就是此时申请的是指针地址值的大小,但是编译器不会提示错误,调试也不会出现错误,只在第二次malloc时才提示。

       解决办法:将GraphAdjList指针类型转换为graphAdjList 结构体类型。

       以后注意:在申请内存大小的时候不能将指针类型填入到sizeof处!

后记:还是Java好用,没那么多事!


  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用malloc函数申请内存,如果申请内存过大,可能会导致内存分配失败。这是因为操作系统在分配内存,需要在内存中找到一块足够大的连续空间来满足申请。如果没有足够大的连续空间,就会分配失败。在这种情况下,可以考虑使用realloc或calloc函数来代替malloc函数。 如果使用realloc函数,可以先使用malloc函数申请一部分内存,然后在需要使用realloc函数重新分配内存。如果realloc函数无法分配足够大的内存,它将返回NULL指针,此可以考虑使用calloc函数。 如果使用calloc函数,它将分配一块指定大小的内存,并将其初始化为0。与malloc函数不同,calloc函数不需要连续的空间,因此可以更好地处理大内存分配问题。 下面是一个使用realloc函数重新分配内存的例子: ```c #include <stdio.h> #include <stdlib.h> int main() { int *ptr; int n = 5, i; // 分配初始内存 ptr = (int*) malloc(n * sizeof(int)); // 检查内存是否分配成功 if (ptr == NULL) { printf("Memory allocation failed\n"); exit(1); } // 输出初始内存中的值 printf("Initial memory allocation:\n"); for (i = 0; i < n; i++) { printf("%d ", *(ptr + i)); } // 重新分配内存 n = 10; ptr = (int*) realloc(ptr, n * sizeof(int)); // 检查内存是否分配成功 if (ptr == NULL) { printf("Memory allocation failed\n"); exit(1); } // 输出重新分配后的内存中的值 printf("\nMemory reallocation:\n"); for (i = 0; i < n; i++) { printf("%d ", *(ptr + i)); } // 释放内存 free(ptr); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值