3 维 malloc 数组的分段错误

Posted

技术标签:

【中文标题】3 维 malloc 数组的分段错误【英文标题】:Segmentation fault with 3-dimensional malloc'ed array 【发布时间】:2018-05-14 00:14:23 【问题描述】:

当我 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]对应的值不存在.

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

【问题讨论】:

如果p_l2p被定义为指向unsigned long long的指针(通常是8字节),为什么在mallocing时你给它sizeof(int)(通常是4字节)? 【参考方案1】:

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

分配的内存不足。

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();

【讨论】:

非常感谢!

以上是关于3 维 malloc 数组的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

USACO dualpal 错误:分段违规

尝试连接二维数组的元素时出现分段错误

动态二维数组。为啥是分段错误?

带有clang的C大数组中的奇怪分段错误

执行动态 malloc 代码时出现“分段错误”

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误