【问题标题】:A error about "Address 0x0 is not stack'd, malloc'd or (recently) free'd" in c program under linux environment在linux环境下的c程序中出现“地址0x0未堆栈,malloc'd或(最近)free'd”的错误
【发布时间】:2011-02-28 14:12:41
【问题描述】:

[编辑1:]

对于seqName,我在文件开头声明为全局参数为

char seqName[20];

[编辑2:]

在实际执行期间传递给程序的不是那些数字吗?我仅使用 valgrind 工具就收到了以下消息。我输入的命令是:

jl@ubuntu:~/work/dsr_analysis$ valgrind --tool=memcheck --leak-check=yes ./test

[编辑3:]

对不起,由于我是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 和 GNU GPL,由 Julian Seward 等人撰写。

==28940== 使用 Valgrind-3.6.0.SVN-Debian 和 LibVEX;

使用 -h 重新运行以获取版权信息

==28940== 命令:./test

==28940==

==28940== 大小为 1 的无效读取

==28940== 在 0x40260CA:strcpy (mc_replace_strmem.c:311)

==28940== by 0x804A5C6: main (me_search.c:1428)

==28940== 地址 0x0 没有被堆栈、malloc 或(最近)释放

==28940==

==28940==

==28940== 进程以信号 11 (SIGSEGV) 的默认操作终止

==28940== 访问不在地址 0x0 的映射区域内

==28940== 在 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 个错误(抑制:8 个中的 13 个)1 个上下文 (抑制:13 从 8)

1 个上下文(抑制:8 个中的 13 个)

【问题讨论】:

    标签: c linux valgrind


    【解决方案1】:

    您确实没有发布足够清晰的代码来确定,但是如果您在没有命令行参数的情况下调用您的可执行文件,那么argv[1] 将包含一个NULL 指针,以及argv[2]argv[3] 等. 将包含未定义的值。

    编辑:您需要在 valgrind 命令行上为程序提供参数(我猜 - 我自己不使用 valgrind)。比如:

    valgrind ... ./test foo bar zod
    

    顺便说一句,在 Linux/Unix 上调用可执行文件 test 是个坏主意,因为它很容易与同名的内置 shell 混淆

    【讨论】:

    • 我不会支持这个。佐德将军必须在农民foobar面前辩论!
    • 一直认为序列是“foo, bar, baz, quux”
    【解决方案2】:

    您应该检查两件事:

    1) 通过检查argc 的值,确保传递正确数量的参数。

    2) 在尝试strcpy() 之前,请确保您已使用malloc()seqName 中分配了足够的空间。

    【讨论】:

      【解决方案3】:

      我认为重点是:sprintf(seqName,"%s", argv[1])

      而你真正想要的是sprintf((strcat(seqName,"%s"), argv[1]) 判断你的代码。

      它在这里尝试做的是将表达式“%s”的值传递到格式中进行解释。该值特别是指向静态内存中“%”的字符指针,旁边有一个“s”,然后是一个“\0”。

      编辑,哦,等等,没关系,我看到它是 sprintf,而不是 printf。那么它可能是argcount

      Edit2:另外,seqName 是否正确初始化和分配?

      【讨论】:

        【解决方案4】:

        您是否检查传递给程序的实际参数数量? (argc)

        如果您的程序获得的参数少于 3 个,并且您尝试访问 argv[1..3] - 您将遇到分段错误和其他不可预知的行为。

        【讨论】:

        • C 中不存在空指针异常或任何类型的异常,请参考。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-23
        • 2020-04-07
        • 1970-01-01
        • 1970-01-01
        • 2019-08-21
        • 1970-01-01
        相关资源
        最近更新 更多