【发布时间】: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字节)?
标签: c segmentation-fault