小编Bas*_*ler的帖子

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

注意:我是学习C的新手,这可能是一个我完全不知道的完全简单的解决方案.在那种情况下,请赐教我.

我在调试C程序时遇到问题,我是从同事处收到的.从本质上讲,我设法将段错误跟踪到失败的调用,calloc()如果n大于46341:

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;
}
Run Code Online (Sandbox Code Playgroud)

ideone上的代码相同.

AFAIK,这恰好评估为4GiB,这就是我怀疑的原因.我试过的系统都是64位,所以分配不应该是个问题.在SO上搜索已经提出了calloc()可能无法找到连续空间的想法,所以我尝试了多次调用calloc(),并试图调用realloc().最后,我试图实现分配n C++,其中调用会float *v = new float[n * …

c linux 64-bit segmentation-fault calloc

1
推荐指数
1
解决办法
429
查看次数

标签 统计

64-bit ×1

c ×1

calloc ×1

linux ×1

segmentation-fault ×1