一个小问题求解
来源: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
我试了一下,一样的环境没有问题哈。。。
00 -
bennyhuo
2024-07-17
看这个错误是出现在内存分配那里,应该可能是传入的指针有问题。
同学可以先尝试一下直接运行我的完整工程,看看是不是会有同样的错误。memset的用法第三个参数是写入的字节数,除以int的大小没有什么道理。032024-07-17 -
bennyhuo
2024-07-17
同学贴一下gcc的版本吧012024-07-17
相似问题