[EDIT1:]
对于seqName,我将其声明为文件开头的全局参数
char seqName [20];
[EDIT2:]
在实际执行期间,不是那些传递给程序的数量?我只是使用valgrind工具得到以下消息.我输入的命令是:
jl @ ubuntu:〜/ work/dsr_analysis $ valgrind --tool = memcheck --leak-check = yes ./test
[EDIT3:]
抱歉,由于我是Valgrind的新用户,当我使用它时,我只在Edit2中键入命令.
但是,我的程序剂量有一些命令行参数.
因此,我认为我最好通过新命令调试我的程序:
valgrind --tool = memcheck --leak-check = yes ./test foreman.cif 352 288
有一个我的程序:
height = atoi(argv[3]); width = atoi(argv[2]); sprintf(seqName,"%s", argv[1]); // strcpy(seqName, argv[1]);
编译之后,生成一个exe文件测试,然后我用Valgrind来检查它.然后我得到了以下信息,但是我无法理解它往往告诉我什么.任何人都可以提供一些帮助,谢谢.
jl @ ubuntu:〜/ work/dsr_analysis $ valgrind --tool = memcheck --leak-check = yes ./test
== 28940 == Memcheck,一个内存错误检测器
== 28940 ==版权所有(C)2002-2009,以及Julian Seward等人的GNU GPL'd.
== 28940 ==使用Valgrind-3.6.0.SVN-Debian和LibVEX;
用-h重新运行版权信息
== 28940 ==命令:./ test
== == 28940
== 28940 ==读取大小为1无效
== 28940 == at 0x40260CA:strcpy(mc_replace_strmem.c:311)
== 28940 == by 0x804A5C6:main(me_search.c:1428)
== 28940 ==地址0x0没有堆叠,malloc'd或(最近)免费
== == 28940
== == 28940
== 28940 ==使用信号11(SIGSEGV)的默认操作终止进程
== 28940 ==不在地址0x0的映射区域内访问
== 28940 == at 0x40260CA:strcpy(mc_replace_strmem.c:311)
== 28940 == by 0x804A5C6:main(me_search.c:1428)
== 28940 ==如果你认为这是因为堆栈而发生的
== 28940 ==溢出程序的主线程(不太可能但是
== 28940 ==可能),你可以尝试增加的大小
== 28940 ==主线程堆栈使用--main-stacksize =标志.
== 28940 ==此次运行中使用的主要线程堆栈大小为8388608.
== == 28940
== 28940 ==堆概要:
== 28940 ==在退出时使用:0个块中的0个字节
== 28940 ==总堆使用量:0个分配,0个释放,0个字节分配
== == 28940
== 28940 ==所有堆块都被释放 - 没有泄漏是可能的
== == 28940
== 28940 ==对于检测到的和抑制的错误计数,请重新运行:-v
== 28940 ==错误摘要:来自1个上下文的1个错误(被抑制:13个来自8个)1个上下文(被抑制:13个来自8个)
1个上下文(被压制:从8个中有13个)
你真的没有发布足够清晰的代码来确定,但如果你没有命令行参数调用你的可执行文件,那么argv[1]
将包含一个NULL
指针argv[2]
,argv[3]
等等将包含未定义的值.
编辑:您需要在valgrind命令行上为程序提供参数(我猜 - 我自己不使用valgrind).就像是:
valgrind ... ./test foo bar zod
BTW,test
在Linux/Unix上调用可执行文件是一个坏主意,因为它很容易与同名的shell内置混淆