提问人: 提问时间:11/4/2023 最后编辑:pmg 更新时间:11/6/2023 访问量:158
collatz 函数中的分割错误
Segmentation fault in collatz function
问:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
#define max 100000000
int64_t table[max];
int64_t collatz(int64_t a);
int main(int argc,char*argv[])
{
if (argc !=3)
{
printf("ERROR\nUsage: ./collatz {argv1} {argv2}\n");
return 1;
}
int64_t maxlen = 0;
int64_t num1 = atoi(argv[1]);
int64_t num2 = atoi(argv[2]);
if (num1 < 1 || num2 < 1 || num1 > max || num2 > max)
{
printf("%"PRId64"\n",maxlen);
return 2;
}
int64_t i;
for (i=num1;i<=num2;i++)
{
int64_t len = collatz(i);
if (len > maxlen)
{
maxlen = len;
}
}
printf("%" PRId64 "\n", maxlen);
return 0;
}
int64_t collatz(int64_t a)
{
if (a <= max)
{
if(table[a] != 0)
{
return table[a];
}
}
int64_t len = 1;
if (a != 1)
{
if (a%2==0)
len += collatz(a/2);
else
len += collatz(a*3+1);
}
if (a <= max)
{
table[a]=len;
}
return len;
}
当我删除 collatz 函数中的最后一个 if 语句时,我出现分段错误。我无法理解这一点,因为数组大小是 100.000.000,而且我从不允许输入大于该值的数字。此外,我知道一个数字可能会超过函数内部的限制,例如 99.999.999,但我很确定高于 100.000.000 的数字永远不会满足函数中的最后一个 if 语句,但是如果我以某种方式删除它,我会得到一个分段错误。
答:
0赞
Chris
11/4/2023
#1
在函数中,你有一个大小的数组。这意味着最大有效索引为 。但是,您测试它小于或等于 。这允许越界阵列访问,并且可能导致分段错误。collatz
table
max
max - 1
a
max
if (a <= max) { if(table[a] != 0) { return table[a]; } }
评论
#define max (100 * 1000 * 1000)
#define max 1e8
100 * 1000
int
10 * 1000 * 1000 * 1000
int
#define max ((size_t)100 * 1000 * 1000
size_t