【发布时间】:2021-11-17 02:04:15
【问题描述】:
我需要创建一个返回整数数组的函数。这个 int 数组应该包含 min 和 max 之间的所有值(都包括在内)。
- 如果 min >= max,则应返回空指针。
问题是为什么当min = -2147483468 和max = 2147483647(以及len 变成4294967296)我得到“分段错误”?
我的代码:
#include <stdlib.h>
#include <stdio.h>
int *ft_range(int min, int max)
{
int *range;
long int len;
long int i;
range = NULL;
if (min >= max)
return (NULL);
len = max - min + 1;
if(!(range = (int *)malloc(sizeof(int) * len)))
return (NULL);
i = 0;
while (min < max)
{
range[i] = min;
min++;
i++;
}
range[i] = max;
return (range);
}
int main(void)
{
int max;
int min;
long int len;
int *range;
long int i;
max = 2147483647;
min = -2147483648;
if (max != min)
len = max - min + 1;
else
len = 0;
i = 0;
range = ft_range(min, max);
while (i < len)
{
printf("%d", range[i]);
i++;
}
free(range);
return (0);
}
但是,如果我输入 min = -2147483468 和 max = 2147483646 和 len = 4294967295 就可以了。
【问题讨论】:
-
len = max - min + 1;-->len = 1L + max - min;避免int在long更宽时溢出。最好使用size_t len和(size_t)1。 -
假设
long int大于int,所以它不是可移植代码,但它可以在OP的系统上运行。 -
您确定您向我们展示的代码中出现了段错误吗?请提供minimal reproducible example(包括函数
main)。 -
你的编译器和操作系统是什么?另外,使每个变量
long long int。 -
用
min = -2147483647 - 1;替换min = -2147483648;以避免UB。