c++ - 你们能帮我用gcc调试一个简单的c程序并让它工作吗?(学生问题..)
问题描述
大家好,我的问题是你能帮我用 gcc 调试一个简单的 c 程序并让它工作吗?
老师给了我这段代码,我应该调试它并让它工作,我试过但没有任何帮助我做不到。
我用它编译了g++ -g double_free.c -o double_free
程序崩溃。
这是代码:
#include <stdlib.h>
#include <stdio.h>
#define ARRAY_SIZE 100000
int main(int argc, char* argv[])
{
int i, test=5;
int* buf = new int[100000];
for (i=0; i< ARRAY_SIZE; i++){
buf[i] = i;
}
int result = 0;
delete []buf;
printf("result: %d\n", result);
delete[] buf;
printf("test %d\n", test);
return 0;
}
解决方案
这是我对此代码的投诉清单:
- 你删
buf
了两次。这确实是我能看到的唯一需要实际调试的项目。事实上,这个练习的名称对于有double_free
经验的编码人员来说是一个致命的赠品,那就是这就是问题所在。
最重要的是:
您应该是 C 编码器或 C++ 编码器,而不是 C+ 编码器(那个奇怪的变体似乎没有完全过渡)。除了要在 C 和 C++ 环境中编译的代码之外,没有理由 C++ 程序应该使用旧的 C 头文件和函数(例如
stdio.h
和printf
)。您应该在需要该数组大小的所有地方使用
ARRAY_SIZE
,否则您可能会在一个地方而不是另一个地方更改它。变量的范围应尽可能紧密。换句话说,摆脱当前的
i
声明,只使用for (int i = ...
.既没有
result
也没有test
改变,也没有buf
用于任何事情,所以你的整个程序归结为std::cout << "result: 0\ntest 5\n";
.如果您不使用它们,那么
argv/c
在您的声明中添加它们几乎没有意义,只需使用.main
int main()
摆脱原始指针并开始使用智能指针是个好主意——它们可以在超出范围时自动释放自己,从而更容易进行内存管理。
推荐阅读
- javascript - 使用 JavaScript/TypeScript 过滤两个数组
- python - 添加错误检查会使脚本陷入无限循环(python)
- c# - 在c#中是否有一种方法可以通过字符串转换子类的实例?
- python - 访问列表中字典的值,然后很好地打印它们
- jenkins - 如何识别 cron 计划何时触发了多分支作业?
- python - 将准备好的 JSONB 对象插入 postgres 时出现 psycopg2 问题
- python - 建立一个基于另一个列
- sql - 为什么这条 SQL 语句这么快?
- c# - Unity PlayerPrefs 没有更新我的“高分”
- css - 中心导航栏品牌和右拉“帮助”图标