热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C-Malloc崩溃/指针损坏的堆-C-MallocCrash/CorruptedHeapwithPointers

Ihaveastructfora2DLinkedListImmaking:我有一个2DLinkedList的结构我正在制作:structNode{void

I have a struct for a 2D LinkedList I'm making:

我有一个2D LinkedList的结构我正在制作:

struct Node
{
    void *data;
    struct Node *up, *left, *right, *down;
};

Since I'm used to Java, I made a function which pretends to be a constructor which looks like:

因为我已经习惯了Java,所以我创建了一个假装成构造函数的函数,它看起来像:

struct Node* buildNode(void *data)
{
    struct Node *node = malloc(sizeof(struct Node*)); // Program crashes here.
    node->data = data;
    node->up = NULL;
    node->left = NULL;
    node->right = NULL;
    node->down = NULL;
    return node;
}

My program crashes when it reaches the malloc line in the second paragraph. If I remove the * from the malloc(sizeof(struct Node*)), it does not crash and works correctly.

当程序到达第二段中的malloc行时,我的程序崩溃了。如果我从malloc(sizeof(struct Node *))中删除*,它不会崩溃并且可以正常工作。

Why is this? My buildNode function is simply returning a pointer to a Node, and is not actually returning the Node struct itself. The error I get has something to do with corrupt heap and since I am somewhat new to C, I don't understand what this all means.

为什么是这样?我的buildNode函数只是返回一个指向Node的指针,并没有实际返回Node结构本身。我得到的错误与腐败堆有关,因为我对C有点新,我不明白这一切意味着什么。

thanks!

谢谢!

1 个解决方案

#1


9  

This line:

这一行:

struct Node *node = malloc(sizeof(struct Node*));

is allocating a memory block of pointer size (4 or 8 bytes depending on whether you're building in 32 or 64 bit mode), and returning a pointer to it. This is not what you want.

正在分配一个指针大小的内存块(4或8个字节,具体取决于你是在32位还是64位模式下构建),并返回一个指向它的指针。这不是你想要的。

Attempting to access members of the returned object results in undefined behavior, such as a crash, as the memory you're hitting is outside the bounds of the allocated space. You might also silently corrupt the heap, so that later calls to malloc result in a crash.

尝试访问返回对象的成员会导致未定义的行为,例如崩溃,因为您正在命中的内存超出了已分配空间的范围。您也可能默默地破坏堆,以便稍后调用malloc会导致崩溃。

Whereas:

鉴于:

struct Node *node = malloc(sizeof(struct Node));

is allocating a block of memory of size of struct Node - which is what you want.

正在分配一个大小为struct Node的内存块 - 这就是你想要的。

As an aside, you should probably be checking the returned pointer isn't NULL before using it, then gracefully handle the error. A NULL would be returned if the allocation fails, for example, if you run out of memory.

顺便说一句,你应该在使用之前检查返回的指针是否为NULL,然后正常处理错误。如果分配失败,将返回NULL,例如,如果内存不足。

Note also that C is (unlike Java) not a garbage collected language. You need to ensure that at some point you call free on every pointer you allocate, or the memory will not be released until the program terminates.

另请注意,C(与Java不同)不是垃圾收集语言。您需要确保在某些时候在您分配的每个指针上调用free,或者在程序终止之前不会释放内存。


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
author-avatar
拾味馆南湖店微博_328
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有