Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.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未返回NULL,但索引数组给出了分段错误_C_Arrays_Memory Management_Segmentation Fault_Malloc - Fatal编程技术网

malloc未返回NULL,但索引数组给出了分段错误

malloc未返回NULL,但索引数组给出了分段错误,c,arrays,memory-management,segmentation-fault,malloc,C,Arrays,Memory Management,Segmentation Fault,Malloc,我使用的是代码块,我的代码如下: 分配数组T: long long TAILLE_MAX= 5000000000000; long long *T= malloc(sizeof(long long)*TAILLE_MAX); 然后,我希望每次都使用数组的一部分,并用降序值填充它: long long step= 5; for(long long TAILLE=500000000; TAILLE<=TAILLE_MAX; TAILLE*=step){ if(step==2) ste

我使用的是代码块,我的代码如下:

分配数组T:

long long TAILLE_MAX= 5000000000000;
long long *T= malloc(sizeof(long long)*TAILLE_MAX);
然后,我希望每次都使用数组的一部分,并用降序值填充它:

long long step= 5;
for(long long TAILLE=500000000; TAILLE<=TAILLE_MAX; TAILLE*=step){
    if(step==2) step=5;
    else step= 2;

    for(long long n=0; n<TAILLE; n++) T[n]= TAILLE-n;
    // rest of code (which is not reached) ...
问题出在这个循环中:

for(long long n=0; n<TAILLE; n++) T[n]= TAILLE-n;
它给出了分段错误,当我使用调试器分析问题时,我发现每当n达到121197052时,它都会给出错误,这必须包含在数组中

我认为这是堆大小的问题,但是T是由malloc分配的,它没有返回NULL

我试图通过将这个添加到链接器中来增加堆的大小:-Wl,-stack,568435456 ,但同样的错误

奇怪的是,我试图分配一个小于5000000000000的,但malloc返回NULL!!!!它如何分配一个大的大小,并返回空的较小的大小

我有Windows7终极64位,4Gb内存,Intel Core Duo 2.80GHz

提前谢谢你的建议

编辑: 关于持有的问题:我不是在寻找调试程序!一点也不!我在询问各种指令的行为,如malloc、内存分配…,我的程序不需要解决方案。我在搜索有关上述几点的有用信息,这些信息对其他成员可能有用,甚至标题也表明我在询问某些东西的行为。

malloc采用大小参数

在MSVC 15.0上,sizeoflong是8,sizeofsize\u t是4。较小的值失败,因为数字正确,但内存不足。较大的值似乎会通过,因为数字被截断,并且假定的内存被分配,但当您为想象的内存编制索引时,它超出了实际内存的范围

对于MSVC,允许的默认内存约为1.9 GB,包括所有内容,无论是静态还是动态。

malloc采用大小参数

在MSVC 15.0上,sizeoflong是8,sizeofsize\u t是4。较小的值失败,因为数字正确,但内存不足。较大的值似乎会通过,因为数字被截断,并且假定的内存被分配,但当您为想象的内存编制索引时,它超出了实际内存的范围


对于MSVC,允许的默认内存约为1.9 GB,包括所有内容,无论是静态还是动态。

它是操作系统和计算机特有的。在Linux上,它被称为一种错误功能,它使系统在malloc或mmap请求上总是成功,即使是在大小令人讨厌的情况下,我通常会禁用它

然而,一点常识应该会让你警觉。您需要5*1012个64位的字,即8字节。这意味着40*1012字节。如果你想要两倍的功率,1GB比109字节多一点,而你的笔记本电脑可能只有很少的一部分,到2016年底可能最多只有16GB。您请求的是40 TB,即40000 GB的RAM,更准确地说是由RAM备份的:即使是非常昂贵的计算机(例如,成本为100万欧元或美元)也没有那么多的RAM可由单个内核寻址,而简单地将这么多内存归零可能需要数小时的CPU时间

实际上,您最好分配内存,并在需要时使用realloc进行扩展。因此,请代之以代码:

size_t size = 1000;
long long *T = malloc(size*sizeof(long long));
if (!T) { perror("malloc"); exit(EXIT_FAILURE); };
您总是检查malloc的故障

在以后的某个时间点,例如读取阵列时,您可能会觉得有必要增加阵列;一般建议是以几何方式试探性地增大尺寸:

size_t newsize = 4*size/3 + 10;
T = realloc(T, newsize*sizeof(long long));
if (!T) { perror("realloc"); exit(EXIT_FAILURE); };

它是特定于操作系统和计算机的。在Linux上,它被称为一种错误功能,它使系统在malloc或mmap请求上总是成功,即使是在大小令人讨厌的情况下,我通常会禁用它

然而,一点常识应该会让你警觉。您需要5*1012个64位的字,即8字节。这意味着40*1012字节。如果你想要两倍的功率,1GB比109字节多一点,而你的笔记本电脑可能只有很少的一部分,到2016年底可能最多只有16GB。您请求的是40 TB,即40000 GB的RAM,更准确地说是由RAM备份的:即使是非常昂贵的计算机(例如,成本为100万欧元或美元)也没有那么多的RAM可由单个内核寻址,而简单地将这么多内存归零可能需要数小时的CPU时间

实际上,您最好分配内存,并在需要时使用realloc进行扩展。因此,请代之以代码:

size_t size = 1000;
long long *T = malloc(size*sizeof(long long));
if (!T) { perror("malloc"); exit(EXIT_FAILURE); };
您总是检查malloc的故障

在以后的某个时间点,例如读取阵列时,您可能会觉得有必要增加阵列;一般建议是以几何方式试探性地增大尺寸:

size_t newsize = 4*size/3 + 10;
T = realloc(T, newsize*sizeof(long long));
if (!T) { perror("realloc"); exit(EXIT_FAILURE); };

内存太多了编译器也是64位吗?我的MSVC 15.0是32位的,即使是64位的机器。您可以传递给malloc的最大值是多少?我怀疑您的long-long被截断了。您通过代码块IDE使用的编译器是否创建64位输出?Malloc将size\u t作为大小参数。在32位系统上,您请求的大小为40000000000000字节

s远远超过32位限制。printf%zu,大小_tsizeoflong*TAILLE_MAX;因此,此错误的原因是您没有打开警告,或者忽略了警告。请参阅对Weather Vane答案的评论!内存太多了编译器也是64位吗?我的MSVC 15.0是32位的,即使是64位的机器。您可以传递给malloc的最大值是多少?我怀疑您的long-long被截断了。您通过代码块IDE使用的编译器是否创建64位输出?Malloc将size\u t作为大小参数。在32位系统上,您请求的40000000000000字节的大小远远超出32位限制。printf%zu,size_tsizeoflong*TAILLE_MAX;因此,此错误的原因是您没有打开警告,或者忽略了警告。请参阅对Weather Vane答案的评论!在这种情况下,如果64位的TAILLE_MAX长度被截断为32位,MSVC不应该发出警告吗?在Windows中,malloc不能超过~4gibib?即使在Win64上,Paul Ogilvie也确实如此,警告C4244:“函数”:从“\uuu int64”转换为“size\u t”,可能会丢失数据。@PaulOgilvie:不确定MSVC,但标准中没有要求,因为已签名到未签名的转换定义良好。对于gcc,您应该使用-Wconversion.No,因为malloc不知道存在从64位到32位的截断。假设您想要0x140000000字节,它作为0x40000000字节传递,您看到问题了吗?这是一个有效的分配,但不是你想要的。请查看sizeofsize\t malloc的参数。在这种情况下,如果64位的TAILLE\u MAX长度被截断为32位,MSVC不应该发出警告吗?在Windows中,malloc不能超过~4G?即使在Win64上,Paul Ogilvie也确实如此,警告C4244:“函数”:从“\uuu int64”转换为“size\u t”,可能会丢失数据。@PaulOgilvie:不确定MSVC,但标准中没有要求,因为已签名到未签名的转换定义良好。对于gcc,您应该使用-Wconversion.No,因为malloc不知道存在从64位到32位的截断。假设您想要0x140000000字节,它作为0x40000000字节传递,您看到问题了吗?这是一个有效的分配,但不是你想要的。请看一下sizeofsize\n这也是malloc的参数。非常有用,谢谢,但我不明白为什么malloc不返回NULL而不分配另一个大小!这是某些操作系统的[mis]功能。谢谢,这两个响应非常有用,非常有用,谢谢,但我不明白为什么malloc不返回NULL而不分配另一个大小!这是某些操作系统的[mis]功能。谢谢你,y,这两个回答很有用