三维malloc'ed数组的分段错误

时间:2018-05-14 00:14:23

标签: c segmentation-fault

当我编译C代码并退出时,我遇到了分段错误。当我尝试运行GDB时,结果如下:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400998 in main (argc=2, argv=0x7fffffffe208) at test.c:107

有问题的一行:

if((p_l2p[p_bp][p_rp][p_cp] & FULL) == 0)

变量声明:

unsigned long long ***p_l2p; //Primary L2P[P_Bank][Row][Cas]
p_l2p = (unsigned long long ***)malloc(sizeof(int **)*P_BANK);

for(i=0;i<P_BANK;i++) // set s[P_Bank][Row]
{
    p_l2p[i] = (unsigned long long **)malloc(sizeof(int*)*ROW);         

    for(j=0;j<ROW;j++) // set s[P_Bank][Row][CAS]
    {
        p_l2p[i][j] = (unsigned long long *)malloc(sizeof(int)*CAS);

    }
}

int p_bp; //Bank Point
int p_rp; //Row Point
int p_cp; //Cas Point

(请注意,P_BANK值为4,ROW值为8192,Column值为128.)

问题是当我尝试通过GDB打印分段故障的点时,如下所示。 (我们确认导致段错误的值是p_l2p [2] [15] [80]。)

段故障为p_l2p [2] [15] [80]的点是由代码声明为动态内存分配的数组之一。我尝试使用GDB的打印功能打印这些变量。奇怪的是,有p_l2p [2] [14] [x]和p_l2p [2] [16] [x]的值,但只有对应于p_l2p [2] [15] [x]的值不存在

这种分段错误的原因是什么?

1 个答案:

答案 0 :(得分:3)

  

这种分段错误的原因是什么?

分配的内存不足。

此处int的尺寸小于unsigned long long的尺寸。 @SHG

避免大小计算错误 - 其中有1,最内层。

分配对象的大小,而不是类型。

the_type_is_irrelevant ***p_l2p;

// p_l2p = (unsigned long long ***)malloc(sizeof(int **)*P_BANK);
p_l2p = malloc(sizeof *p_l2p * P_BANK);

for(i=0; i<P_BANK; i++) {
    // p_l2p[i] = (unsigned long long **)malloc(sizeof(int*)*ROW);         
    p_l2p[i] = malloc(sizeof p_l2p[i][0] * ROW);         

    for(j=0; j<ROW; j++) {
        // p_l2p[i][j] = (unsigned long long *)malloc(sizeof(int)*CAS);
        p_l2p[i][j] = malloc(sizeof p_l2p[i][j][0]* CAS);

    }
}

注意:即使int *的大小也可能与unsigned long long *不同,但这种情况很少见。最好不要假设所有指针类型共享相同的大小。当存在一个时,最常见的区别在于指向对象的指针和指向函数的指针。

此处不需要演员。

强大的代码也会检查分配结果。

p_l2p = malloc(sizeof *p_l2p * P_BANK);
if (p_l2p == NULL && P_BANK > 0) {
  Handle_Out_of_Memory();
}