C 程序仅在字符阵列获得“ 1000!”的输入时才在DELETE上崩溃

C++ program crashes at delete only when character array gets the input of "1000!"

本文关键字:输入 DELETE 崩溃 1000 字符 程序 阵列      更新时间:2023-10-16

我使用C 中的GMP库编写了一个快速而肮脏的阶乘程序,该程序为字符数组分配了一些内存。该程序适用于我测试的所有输入值,除了1000。

我已经尝试了分配内存的不同方法,以及不同的方式来处理它,但是没有一个工作,但几乎总是在1000上崩溃。

这是创建字符数组和删除它之间发生的一切。factor是计算出的阶乘,mpz_sizeinbase返回指定基数中数字中的数字数。gmp_sprintf只是将数字转换为字符数组。

int count = mpz_sizeinbase(factor, 10);
    char* zeroes = new char[count];
    gmp_sprintf(zeroes, "%Zd", factor);
    printf("After conversion: %sn", zeroes);
    int trailingzeroes = 0;
    for(int i = strlen(zeroes)-1; i > 0; i--){
        if(zeroes[i] == '0')
            trailingzeroes++;
        else
            break;
    }
    printf("Trailing zeroes: %in", trailingzeroes);

    delete [] zeroes;

当输入为1000时,这意味着我要计算1000!,我会得到错误

double free or corruption (!prev)
Aborted

delete []。据我所知,所有其他输入都可以。我会做什么错?

来自 mpz_sizeinbase文档:"适量的分配数量通常是mpz_sizeinbase返回的值多两个,一个额外的符号,一个额外的符号,一个额外的符号和一个减去符号和一个减去符号一个用于null末端的人。" 您可能没有负面阶乘,但是您肯定不是在分配足够的空间来包括终止的null字符。

检查gmp_sprintf的返回值是有启发性的,因为它告诉您它实际写了多少个字符。我敢打赌,在您的情况下,它返回count+1,这意味着它在缓冲区的末端写了(这是未定义的行为(。

有时可能起作用的事实可能与以下事实有关:"结果要么精确或1个太大" (对于2个以外的基础(。当然,ub。

的不可预测性质