C 分段错误,在int的边界范围上
创建一个函数ft\u range,该函数返回一个数组。此整数数组应包含最小值和最大值之间的所有值。 包括最小值-不包括最大值。C 分段错误,在int的边界范围上,c,malloc,C,Malloc,创建一个函数ft\u range,该函数返回一个数组。此整数数组应包含最小值和最大值之间的所有值。 包括最小值-不包括最大值。 #include <printf.h> #include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <stdlib.h> int *ft_range(int min, int max) { int *ptrInt;
#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');
}
}
#包括
#包括
#包括
#包括
#包括
整数*整数范围(整数最小值,整数最大值)
{
int*ptrInt;
int i;
内部温度;
温度=分钟;
i=0;
ptrInt=NULL;
如果(最大值<最小值)
{
返回(ptrInt);
}否则
{
ptrInt=malloc(最大-最小);
}
而(i<(最大-最小))
{
*(ptrInt+i)=温度+i;
i==473742332时的i++;/trows segfault
}
返回(ptrInt);
}
int*ft_范围(int最小值,int最大值);
int main()
{
int i=0;
int min=-947483640;
int max=947483640;
int*ptr=ft_范围(最小值、最大值);
while(ptr!=NULL)
{
printf(“%d”,*ptr);
printf(“%c”,“\n”);
}
}
如果我输入更大的值,segfault也会输入更大的值。
当
int
比char
宽时,代码分配的内存不足,这是非常常见的
根据指向对象的大小进行分配
ptrInt=malloc(max-min);***-->ptrInt=malloc((最大-最小)*sizeof*ptrInt)另外,大多数人更喜欢数组表示法:*(ptrInt+i)=temp+i代码>-->ptrInt[i]=temp+i
malloc
ed的内存区域的大小超过了写入的内存区域的大小,从而调用了未定义的行为,因此得到了segfault。malloc
接受要分配的字节数<计算机上的code>sizeof int
肯定大于一个字节,因此仅分配max-min
字节不足以存储那么多int
s。修复segfault后,将在main
中进入无限循环ptr
在while
循环中永远不会更新。如果这是两个独立的源文件,请指出。如果没有,通常所有的#include
指令都会放在文件的顶部。@wildplasser谢谢你,这很有帮助。还有一个角落的案例min==max
,它没有被你的检查捕获,但会导致malloc(0)
是否存在标准一致性C的int
宽度不大于char
的情况?@ChristianGibbons已知一些图形处理器对所有整数类型使用相同的64位大小。不寻常,但C允许。不幸的是,我目前没有时间检查标准,但char
不是保证为一个字节(即,字节由char\u位或类似的定义),并且int
保证不少于两个字节吗?在C中,“字节”至少是8位。研究字符位
。Achar
使用char\u位
位-一个C“字节”。如果CHAR\u BIT>=16
,那么int
也可能是1c“字节”。好吧,我现在就听你的。稍后我会在标准中查找,但我相信这是准确的。
int *ptrInt;
...
// ptrInt = malloc(max - min);
ptrInt = malloc(sizeof *ptrInt * (max - min));
// ^------------^ ^---------^ number of elements
// +------------+-------------- size of 1 element