对于大于4GiB的阵列,在64位系统上调用calloc失败
注意:我刚开始学习C,这可能有一个我不知道的非常简单的解决方案。那样的话,请你开导我 我在调试一个C程序时遇到问题,这是我从一位同事那里收到的。实际上,如果对于大于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
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;