我正在研究一个使用共享内存的项目,并且遇到令人难以置信的seg错误。由于某种原因,我分配给*节点的所有内存都不可访问。在某个索引(程序的每次运行相同)时,无法写入内存。下面是我的代码和一些输出。
int shf = shm_open("/queue", O_RDWR|O_CREAT, 0666);
int success = ftruncate(shf, sizeof(QNode)*numVertices*numVertices);
QNode *node = (QNode*) mmap(NULL, sizeof(QNode)*numVertices*numVertices, PROT_READ|PROT_WRITE, MAP_SHARED, shf, 0);
int a, b;
for (a=0; a<numVertices; a++) {
for (b=0; b<numVertices; b++) {
(node[sizeof(QNode)*a*numVertices + sizeof(QNode)*b]).k = a;
(node[sizeof(QNode)*a*numVertices + sizeof(QNode)*b]).i = b;
printf("Mapping to offset %d\ti:%d\tk:%d\n", sizeof(QNode)*a*numVertices + sizeof(QNode)*b, (node[sizeof(QNode)*a*numVertices + sizeof(QNode)*b]).i,(node[sizeof(QNode)*a*numVertices + sizeof(QNode)*b]).k);
}
}
较小图表上的输出:
// Bunch of output
Offset: 472 i:5 k:6
Offset: 480 i:6 k:6
Offset: 488 i:7 k:6
Offset: 496 i:8 k:6
Offset: 504 i:0 k:7
Offset: 512 i:1 k:1
Offset: 520 i:1 k:1
Offset: 528 i:1 k:0
Offset: 536 i:1 k:1
Offset: 544 i:1 k:1
Offset: 552 i:1 k:0
Offset: 560 i:0 k:0
// More incorrect output down here
在下面较大的图表输出中,有一些令人费解的结果我无法在此处发布 - 在偏移7168处,它开始打印出不可打印的字符。例如,在偏移7168的行上,我看到Ma [NUL] [NUL] [NUL] [NUL] [SI] [NUL] [NUL] [NUL]偏移7168 ...这是我实际可以显示给你的输出较大的图 - 在最后一行之后它会出现故障。
在较大的图表上输出:
// Bunch of output
Mapping to offset 9136 i:54 k:17
Mapping to offset 9144 i:55 k:17
Mapping to offset 9152 i:56 k:17
Mapping to offset // This is where it seg faults...
非常感谢任何帮助!
答案 0 :(得分:2)
嗯...确实要像node[sizeof(QNode)*a*numVertices + sizeof(QNode)*b]
那样索引吗? C会自动将索引乘以指向的struct的大小,因此我觉得node[a*numVertices + b]
看起来会更加清晰。