C 程序仅在字符阵列获得“ 1000!”的输入时才在DELETE上崩溃
C++ program crashes at delete only when character array gets the input of "1000!"
我使用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。
相关文章:
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 检查输入是否不是整数或数字
- 正在尝试了解输入验证循环
- 读取文件并输入到矢量中
- C++如何通过用户输入删除列表元素
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 运算符C++ "delete []"仅删除 2 个前值
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 用户定义函数中的指针和输入
- 如何在C++中检查2D数组中负值的输入验证
- 如何只允许用户输入正整数
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 输入中的字符串数未知(以字母表示)
- C 程序仅在字符阵列获得“ 1000!”的输入时才在DELETE上崩溃