Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用具有大尺寸参数的malloc时的C分割错误_C_Arrays_Segmentation Fault_Malloc - Fatal编程技术网

使用具有大尺寸参数的malloc时的C分割错误

使用具有大尺寸参数的malloc时的C分割错误,c,arrays,segmentation-fault,malloc,C,Arrays,Segmentation Fault,Malloc,我在分配一个大尺寸的动态数组时遇到了一个错误 作为一个具体示例,以下代码会导致segfault int max = 1399469912; int *arr = (int*) malloc((max+1) * sizeof(int)); arr[0] = 1; 但是,如果我用较小的值(如5)替换max,则不会出现segfault int max = 1399469912; int *arr = (int*) malloc((max+1) * sizeof(int)); arr[0] = 1;

我在分配一个大尺寸的动态数组时遇到了一个错误

作为一个具体示例,以下代码会导致segfault

int max = 1399469912;
int *arr = (int*) malloc((max+1) * sizeof(int));
arr[0] = 1;
但是,如果我用较小的值(如5)替换max,则不会出现segfault

int max = 1399469912;
int *arr = (int*) malloc((max+1) * sizeof(int));
arr[0] = 1;
为什么会发生这种情况?或者,有没有其他解决方案可以达到同样的效果?我需要一个有效大小的动态分配数组

感谢Reed(或来自Linux手册页)

它可能会失败,然后返回
NULL
;您的代码应该处理这种情况:

int *arr = malloc((max+1) * sizeof(int));
if (!arr) { perror("malloc arr"); exit(EXIT_FAILURE); };
你可以用其他方法来处理失败,但你要给出原因。实际上,恢复
malloc
calloc
故障相当棘手。在大多数情况下,像上面那样突然退出是最简单的事情。在某些情况下(考虑一个应该连续运行的服务器程序),您可以执行其他操作(但这很困难)

还可以阅读(一个全系统可配置的东西或功能,我个人不喜欢并禁用它,因为它可能会使
malloc
在内存资源耗尽时明显成功;在Linux上阅读)

另请参见(malloc的愚蠢实现
malloc

顺便说一句,您需要确保
(max+1)*sizeof(int)
没有溢出,您最好定义
大小\u t max=1399469912(不是
int

请注意,您正在请求(在具有
sizeof(int)==4的系统上,如我的Linux/x86-64桌面)超过5 GB的数据。这是相当数量的。

里德(或来自Linux手册页)

它可能会失败,然后返回
NULL
;您的代码应该处理这种情况:

int *arr = malloc((max+1) * sizeof(int));
if (!arr) { perror("malloc arr"); exit(EXIT_FAILURE); };
你可以用其他方法来处理失败,但你要给出原因。实际上,恢复
malloc
calloc
故障相当棘手。在大多数情况下,像上面那样突然退出是最简单的事情。在某些情况下(考虑一个应该连续运行的服务器程序),您可以执行其他操作(但这很困难)

还可以阅读(一个全系统可配置的东西或功能,我个人不喜欢并禁用它,因为它可能会使
malloc
在内存资源耗尽时明显成功;在Linux上阅读)

另请参见(malloc的愚蠢实现
malloc

顺便说一句,您需要确保
(max+1)*sizeof(int)
没有溢出,您最好定义
大小\u t max=1399469912(不是
int


请注意,您正在请求(在具有
sizeof(int)==4的系统上,如我的Linux/x86-64桌面)超过5 GB的数据。这是一个很大的内存量。

malloc()
如果无法分配请求的内存,则返回
NULL
。如果无法分配请求的内存,则应将
malloc()
返回的值与
NULL
malloc()
返回的
NULL
进行比较。您应该对照
NULL

检查
malloc()
返回的值。您必须检查
malloc
是否返回有效指针或分配内存失败。在这种情况下,它返回一个
null
。指针

int max = 1399469912;
int *arr = (int*) malloc((max+1) * sizeof(int));
if( arr == NULL )
{
     /* Malloc failed, deal with it */
}else{
 //fine here
 arr[0] = 1;
}
引用
手册页

如果成功,则为calloc()、malloc()、realloc()、reallocf()和valloc() 函数返回指向已分配内存的指针。如果有错误, 它们返回一个空指针,并将errno设置为ENOMEM


您必须检查
malloc
是否返回有效指针或分配内存失败。在这种情况下,它返回一个
null
。指针

int max = 1399469912;
int *arr = (int*) malloc((max+1) * sizeof(int));
if( arr == NULL )
{
     /* Malloc failed, deal with it */
}else{
 //fine here
 arr[0] = 1;
}
引用
手册页

如果成功,则为calloc()、malloc()、realloc()、reallocf()和valloc() 函数返回指向已分配内存的指针。如果有错误, 它们返回一个空指针,并将errno设置为ENOMEM


首先其次,如果调用失败并返回空指针怎么办?你需要检查一下。A代表雄心壮志。A也用于分配。尝试分配5.6G字节是一个相当雄心勃勃的分配。如果使用64位数字进行运算,则需要大约5Gib的内存。您的系统允许您分配这么多吗?在使用之前,必须检查
malloc()
中的返回值。这并不总是足够的(Linux和OOM-内存不足-杀手),但这是必要的。我有一种预感,OP正试图在32位操作系统上做到这一点。首先?其次,如果调用失败并返回空指针怎么办?你需要检查一下。A代表雄心壮志。A也用于分配。尝试分配5.6G字节是一个相当雄心勃勃的分配。如果使用64位数字进行运算,则需要大约5Gib的内存。您的系统允许您分配这么多吗?在使用之前,必须检查
malloc()
中的返回值。这还不够(Linux和OOM—内存不足—杀手),但这是必要的。我有一种预感,OP正在32位操作系统上尝试这样做。我如何确定失败的原因?+1表示大小\u-tr建议,即使在编译时已知大小的情况下,每个好的编译器都会在出现溢出时警告您=)我如何确定失败的原因?+1表示大小\u-tr建议虽然在编译时已知大小的情况下,如果出现任何溢出,每个好的编译器都会向您发出警告=)