一个小问题求解

来源:15-3 使用控制台调试计算器的输入输出

慕容2423615

2024-07-17

原版

static void ClearAll(CalcContext *calcContext){
    ClearBuffer(calcContext);
    calcContext->result = 0;
    memset(&calcContext->previous_operation,0,sizeof(Operation));
    memset(&calcContext->current_operation,0,sizeof(Operation));
}

这个版本运行的时候就会出错:
malloc.c:2617: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)’ failed.
修改后

static void ClearAll(CalcContext *calcContext){
    ClearBuffer(calcContext);
    calcContext->result = 0;
    memset(&calcContext->previous_operation,0,sizeof(Operation)/sizeof(int ));
    memset(&calcContext->current_operation,0,sizeof(Operation)/sizeof(int));
}

这个样子就不会了
环境是:ubuntu 64位 22版本 虚拟机环境
编译器是 gcc
内存:4g

尝试用了valgrind 这个工具,有点看不明白,但是原版的版本会显示 memset 的那段代码 Invalid write of size 8,新版就没有。。。

写回答

3回答

bennyhuo

2024-07-17

https://img1.sycdn.imooc.com/szimg/6697d3a5098dd7c614011568.jpg


我试了一下,一样的环境没有问题哈。。。

0
0

bennyhuo

2024-07-17

看这个错误是出现在内存分配那里,应该可能是传入的指针有问题。

同学可以先尝试一下直接运行我的完整工程,看看是不是会有同样的错误。memset的用法第三个参数是写入的字节数,除以int的大小没有什么道理。
0
3
慕容2423615
回复
bennyhuo
回复 bennyhuo:感谢老师
2024-07-17
共3条回复

bennyhuo

2024-07-17

同学贴一下gcc的版本吧
0
1
慕容2423615
11.4.0
2024-07-17
共1条回复

C语言系统化精讲 重塑编程思想 打造坚实的开发基础

如果通向大牛的道路有捷径,那就是先学好C语言

2208 学习 · 853 问题

查看课程