C 分段错误,在int的边界范围上

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;

创建一个函数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;
    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位。研究
字符位
。A
char
使用
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