[随笔]记一个错误:链表中创建删除节点(malloc与free)

千里之堤,溃于蚁穴。有时候真的往往是一个很小的疏忽就导致全局的错!

下面的代码记录了我的一次错误,首先提示一下观众姥爷这个错误是在free的时候产生的!

下面附上源码,下面的代码是对一个链表的尾插和尾删除。大家可以看看这个错误出在哪里?(我当时改出这个错误的时候真的觉得自己是一个呆子,会在这种地方犯错,并且没有第一时间想到错误出现在了哪里?一直调试和盯着一个正确的地方。)

现在想想也真是好笑。



下面我就来说一下这个错误,确实问题是出现在了free的时候,而在这个地方我犯的错误是,free的空间与malloc出来的空间不匹配。

错误就出现在上面这张图中的标记的地方,我在malloc一块空间的时候,本想malloc出了一个节点,作为原链表的下一个节点。却一时疏忽将:

c 复制代码
SListNode* newNode = (SListNode*)malloc(sizeof(SListNode));

写成了下面的样子:

c 复制代码
SListNode* newNode = (SListNode*)malloc(sizeof(SListDataType));

导致了在后期SListPopBack()的时候free的空间与先前malloc出来的空间是不一致的,于是就有了文章开篇时候的那个错误!

文章在这个地方其实就要结束了,但是回头一想,应该在这个地方总结一下问题: 常见的malloc与free的错误!

1、malloc的空间与free的空间大小不一致!,上面已经提到,这里就不细说了!

2、对非动态开辟内存使用free释放,这里我仿造一个环境出来:

c 复制代码
void test()
{
    int a = 10;
    int *p = &a;
    free(p);
}

像这样就会出现堆栈访问冲突的错误。

3、malloc的空间,free之后再次重复free

c 复制代码
int* pi = (int*)malloc(sizeof(int));
//...
free(pi);
//...
free(pi);

像这样,对同一块空间重复释放的操作也是一个经典的错误之一。这里的解决方案就是在free空间释放之后,应该立刻将pi指针置为NULL;

4、对malloc动态开辟出来的空间忘记释放(会造成内存泄漏),这里我仿造一个环境出来:

c 复制代码
void test()
{
    int *p = (int *)malloc(100);
    if(NULL != p)
    {
        *p = 20;
    }
}
int main()
{
    test();
    while(1);
}

上面这一段代码就是,malloc之后没有释放,造成了内存泄漏。

5、malloc出来的空间越界访问 malloc出来的空间也是不能够越界访问的,这一点很好理解,就不细说了。

终...

相关推荐
LONGZETECH2 小时前
新能源技术实训难题破解:纯电动汽车五大核心系统三维仿真解决方案
大数据·c语言·人工智能·安全·汽车
知识分享小能手3 小时前
C学习教程,从入门到精通,C语言输入和输出(4)
c语言·开发语言·学习
沐晓时光13 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
SuperByteMaster15 小时前
wfi进入之前没有清除basepri, 导致中断优先级不够,wfi 退不出来
c语言
Navigator_Z16 小时前
LeetCode //C - 1286. Iterator for Combination
c语言·算法·leetcode
奋斗的阿狸_198618 小时前
ESP32-S3 + ES7210 四通道麦克风录音上传方案
c语言·开发语言·fpga开发
2401_8628808218 小时前
iMX6ULL 驱动工程搭建 + LED 灯驱动
c语言·驱动开发·嵌入式硬件
ACP广源盛1392462567319 小时前
Type‑C 扩展坞方案选型笔记|国产 DP1.4 转 HDMI2.0 桥接芯片 GSV2201S @ACP评估
c语言·开发语言·笔记·硬件架构·硬件工程·国产芯片
沐欣工作室_lvyiyi19 小时前
超市智能货架系统设计与实现(论文+源码)
c语言·单片机·课程设计·电子信息工程毕业设计·黑龙江工商学院·广州工商学院·成都工业学院
C++ 老炮儿的技术栈19 小时前
static的作用
c语言·c++·人工智能·单片机·c