Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.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
对于大于4GiB的阵列,在64位系统上调用calloc失败_C_Linux_Segmentation Fault_64 Bit_Calloc - Fatal编程技术网

对于大于4GiB的阵列,在64位系统上调用calloc失败

对于大于4GiB的阵列,在64位系统上调用calloc失败,c,linux,segmentation-fault,64-bit,calloc,C,Linux,Segmentation Fault,64 Bit,Calloc,注意:我刚开始学习C,这可能有一个我不知道的非常简单的解决方案。那样的话,请你开导我 我在调试一个C程序时遇到问题,这是我从一位同事那里收到的。实际上,如果n大于46341,我设法将segfault错误跟踪到对calloc()的调用失败: float*v=(float*)calloc(n*(n-1)/2,sizeof(float)) 下面是一组触发问题的最小代码: #include <stdio.h> #include <stdlib.h> int main(int ar

注意:我刚开始学习C,这可能有一个我不知道的非常简单的解决方案。那样的话,请你开导我

我在调试一个C程序时遇到问题,这是我从一位同事那里收到的。实际上,如果
n
大于46341,我设法将segfault错误跟踪到对
calloc()的调用失败:

float*v=(float*)calloc(n*(n-1)/2,sizeof(float))

下面是一组触发问题的最小代码:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]){

    int ngenes = 46341;

    float *v = (float*) calloc(ngenes * (ngenes - 1)/2, sizeof(float));
    if(v) printf("Allocation succeeded\n");
    free(v);

    ngenes++;

    v = (float*) calloc(ngenes * (ngenes - 1)/2, sizeof(float));
    if(v) printf("Allocation succeeded\n");
    free(v);

    return 0;
}
美元免费 缓存的可用共享缓冲区总数 成员:396222336 368621612 27600724 32320 281536 346677332 -/+缓冲区/缓存:21662744 374559592 掉期:125061116 64894524 60166592 我尝试过使用以下工具进行编译:

gcc-m64…

无济于事。正在运行
printf(“%lu\n”,最大大小)返回
18446744073709551615


老实说,我没有主意。

您很可能是在LP64体系结构上编译的,其中
int
是32位的,但是
long
和指针是64位的。大小计算以整数精度结束,然后提升到64位,从而产生不正确的大小(负数,或比预期短得多)

解决方法是使用

size_t ngenes = 46341;

相反
size\t
是应该用于内存对象大小和长度的类型。

很可能是在LP64体系结构上编译的,其中
int
为32位,但
long
和指针为64位。大小计算以整数精度结束,然后提升到64位,从而产生不正确的大小(负数,或比预期短得多)

解决方法是使用

size_t ngenes = 46341;

相反<代码>大小\u t
是您应该用于内存对象大小和长度的类型。

ngenes
是一个
int
。在C语言中,您应该编写
float*v=calloc(n*(n-1)/2,sizeof(*v)) C++不是C++。我认为我已经访问了这个可能性,并从我同事的源文件中复制了代码。看来我想错了,这正是问题所在。感谢您的帮助。
ngenes
是一个
int
。在C语言中,您应该编写
float*v=calloc(n*(n-1)/2,sizeof(*v)) C++不是C++。我认为我已经访问了这个可能性,并从我同事的源文件中复制了代码。看来我想错了,这正是问题所在。谢谢你的帮助。非常感谢,我发誓我已经试过了,但是在你的建议之后,我试着去验证它,它正在工作。我责怪第四杯红酒。非常感谢,我发誓我已经试过了,但是在你的建议之后,我试着验证了它,它起作用了。我责备第四杯红酒。
size_t ngenes = 46341;