【问题标题】:weird crash with strtol() in CC 中 strtol() 的奇怪崩溃
【发布时间】:2012-05-18 00:56:41
【问题描述】:

我正在使用 stdlib 库中的 strtol() 进行一些证明,因为我有一个总是崩溃的程序,我发现它运行良好:

main(){
char linea[]="0x123456",**ap;
int num;
num=strtol(linea,ap,0);
printf("%d\n%s",num,*ap);
}

但是当我添加一个新的声明时,不管它在哪里崩溃

main(){
char linea[]="0x123456",**ap;
int num;
num=strtol(linea,ap,0);
printf("%d\n%s",num,*ap);
int k;
}

只需添加最后的“int k;”程序在执行 strtol() 时崩溃无法理解原因。 我在 Code::Blocks 上这样做

【问题讨论】:

    标签: c std strtol


    【解决方案1】:

    您会发生崩溃,因为您正在传递 strtol 一个未初始化的指针,而 strtol 取消引用它。你不会因为运气而第一次崩溃。

    这不会崩溃:

    main() {
        char linea[]="0x123456", *ap;
        int num;
        num = strtol(linea, &ap, 0);
        printf("%d\n%s", num, ap);
        int k;
    }
    

    【讨论】:

    • 感谢它确实有效!但是关于运气我不这么认为,每次如果我添加任何其他变量它都会崩溃,没有新变量永远不会崩溃但是非常感谢你
    • @MarkE “运气”的意思是,由于它是一种未定义的行为,因此不一定会发生崩溃。当您声明一个额外的变量时,您会更改堆栈上自动变量的布局,因此曾经导致一个堆栈布局崩溃的非法写入不会导致另一个堆栈布局崩溃。如果您不在 Windows 上,请尝试将 valgrind 与旧程序一起使用,即使没有崩溃,它也应该能查明问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    相关资源
    最近更新 更多