【发布时间】:2015-02-05 07:55:03
【问题描述】:
我对这段代码有疑问。 它按预期工作,除了它在最后得到 Seg 错误。
代码如下:
void distribuie(int *nrP, pach *pachet, post *postas) {
int nrPos, k, i, j;
nrPos = 0;
for (k = 0; k < 18; k++)
pos[k].nrPac = 0;
for (i = 0; i < *nrP; i++) {
int distributed = 0;
for (j = 0; j < nrPos; j++)
if (pac[i].idCar == pos[j].id) {
pos[j].vec[pos[j].nrPac] = pac[i].id;
pos[j].nrPac++;
distributed = 1;
break;
}
if (distributed == 0) {
pos[nrPos].id = pac[i].idCar;
pos[nrPos].vec[0] = pac[i].id;
pos[nrPos].nrPac = 1;
nrPos++;
}
}
for (i = 0; i < nrPos; i++) {
printf("%d %d ", pos[i].id, pos[i].nrPac);
for (j = 0; j < pos[i].nrPac; j++)
printf("%d ", pos[i].vec[j]);
printf("\n");
}
}
并在 main() 中调用此函数。
使用 gdb 运行导致此错误:
Program received signal SIGSEGV, Segmentation fault.
0x00000001 in ?? ()
【问题讨论】:
-
您是否对该
gdb会话进行了回溯? -
尝试在它上面运行 valgrind...你可能会在某处弄乱内存另外,如果你从不改变它的值,为什么 nrP 是指向 int 的指针?
-
@Antzi Running with valgrind 显示相同:进程以信号 11 (SIGSEGV) 的默认操作终止 ==15484== 访问不在地址 0x0 ==15484== 0x1 的映射区域内:? ??堆摘要:==15484== 退出时使用:10 个块中的 390 个字节 ==15484== 总堆使用量:10 个分配,0 个释放,分配 390 个字节 ==15484== ==15484== 泄漏摘要:= =15484== 肯定丢失了:10 个块中的 390 个字节
-
是 'pos' 某种全局数组还是拼写错误?
-
另一个建议是在你的函数中添加断言,确保所有索引都在预期的大小范围内。例如
assert( sizeof( pos ) / sizeof( pos[0] ) >= 18 );
标签: c debugging segmentation-fault