我试图使用mmap创建/访问twi不同的(N 2)*(N 2)2D双精度数组,以便多个线程可以查看它们自己的部分并更改它,应用更改以便所有其他线程可以看到 . 这是我有的:
int main(int argc, char *argv[]) {
int N = atoi(argv[1]);
int numProcs = atoi(argv[2]);
int ARRAY_SIZE = (N+2)*(N+2)*sizeof(double);
double **grid = (double **) mmap(NULL, ARRAY_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
if (grid == MAP_FAILED) {
printf("Error mmapping grid\n");
}
double **newGrid = (double **) mmap(NULL, ARRAY_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
if (newGrid == MAP_FAILED) {
printf("Error mmapping grid\n");
}
当我运行它,或尝试访问其中的任何内容时,我会遇到分段错误 . 我试图分配内存,用:
for(i = 0; i < N+2; i++) {
for(j = 0; j < N+2; j++) {
grid[i][j] = malloc(sizeof(double));
}
}
for(i = 0; i < N+2; i++) {
for(j = 0; j < N+2; j++) {
newGrid[i][j] = malloc(sizeof(double));
}
}
但我遇到了:错误:从不兼容的类型'void *'分配'double''newGrid [i] [j] = malloc(sizeof(double));
我相信我在这里错过了mmap的工作方式,有人能指出我正确的方向吗?
2 回答
如果N是编译时常量或者编译器支持可变长度数组(VLA),那么您可以简单地执行:
如果N不是常量且编译器不支持VLA,则需要手动偏移:
数组或数组数组是内存的连续区域 . 使用指针指针的"2d array"不是连续的 .
让我们看一些“图像”进行比较:
适当的数组数组在内存中看起来像这样:
另一方面,使用指针指针的矩阵看起来像这样:
正如你所看到的那样,它们的内存布局是完全不同的,这就是为什么你不能使用另一个 .