【发布时间】:2018-09-26 20:20:01
【问题描述】:
创建一个函数 ft_range,它返回一个整数数组。此 int 数组应包含最小值和最大值之间的所有值。 包含最小值 - 排除最大值。
#include <printf.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdlib.h>
int *ft_range(int min, int max)
{
int *ptrInt;
int i;
int temp;
temp = min;
i = 0;
ptrInt = NULL;
if (max < min)
{
return (ptrInt);
} else
{
ptrInt = malloc(max - min);
}
while (i < (max - min))
{
*(ptrInt + i) = temp + i;
i++; /trows segfault at i == 473742332
}
return (ptrInt);
}
int *ft_range(int min, int max);
int main()
{
int i = 0;
int min = -947483640;
int max = 947483640;
int *ptr = ft_range(min, max);
while (ptr != NULL)
{
printf("%d", *ptr);
printf("%c", '\n');
}
}
如果我输入更大的值,段错误也会抛出更大的值。 而且这段代码在较低的值上也能完美运行。
【问题讨论】:
-
ptrInt = malloc(max - min); **-->>** ptrInt = malloc((max - min) *sizeof *ptrInt);此外,大多数人更喜欢数组表示法:*(ptrInt + i) = temp + i;-->>ptrInt[i] = temp + i; -
您遇到了段错误,因为您通过写入超出您
malloced 的内存区域的大小来调用未定义的行为。malloc接受要分配的字节数。您机器上的sizeof int肯定大于一个字节,因此仅分配max - min字节不足以存储那么多ints。修复段错误后,您将在main中进入无限循环。ptr永远不会在您的while循环中更新。 -
如果这是两个独立的源文件,请注明。如果没有,通常所有的
#include指令都放在文件的顶部。 -
@wildplasser 谢谢你,它有帮助。
-
还有一个极端情况
min==max,没有被你的支票抓到,而是导致malloc(0)