我正在尝试使用mmap来创建/访问两个不同的(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));
}
}
但我遇到了:错误:分配到&#39; double&#39;来自不兼容的类型&#39; void *&#39; newGrid [i] [j] = malloc(sizeof(double));
我相信我在这里错过了mmap的工作方式,有人能指出我正确的方向吗?
答案 0 :(得分:3)
数组或数组数组是内存的连续区域。 A&#34; 2d阵列&#34;使用指针指针&#34;是不连续。
让我们看看一些&#34;图像&#34;比较:
正确的数组数组在内存中看起来像这样:
+--------------+--------------+-----+----------------+--------------+-----+------------------+ | matrix[0][0] | matrix[0][1] | ... | matrix[0][N-1] | matrix[1][0] | ... | matrix[M-1][N-1] | +--------------+--------------+-----+----------------+--------------+-----+------------------+
另一方面,使用指向指针的矩阵看起来像这样:
+-----------+-----------+-----------+-----+ | matrix[0] | matrix[1] | matrix[2] | ... | +-----------+-----------+-----------+-----+ | | | | | V | | +--------------+--------------+-----+ | | | matrix[2][0] | matrix[2][1] | ... | | | +--------------+--------------+-----+ | | | V | +--------------+--------------+-----+ | | matrix[1][0] | matrix[1][1] | ... | | +--------------+--------------+-----+ | V +--------------+--------------+-----+ | matrix[0][0] | matrix[0][1] | ... | +--------------+--------------+-----+
正如你所看到的那样,它们的内存布局是完全不同的,这就是为什么你不能使用另一种内存布局。
答案 1 :(得分:2)
如果N是编译时常量或者编译器支持可变长度数组(VLA),那么您可以这样做:
double (*grid)[N+2] = (double (*)[N+2]) mmap(NULL, ARRAY_SIZE, ...
grid[4][5] = 2.0; // setting an element
如果N不是常数且编译器不支持VLA,则需要手动偏移:
double *grid = (double *) mmap(NULL, ARRAY_SIZE, ...
grid[4 * (N + 2) + 5] = 2.0; // setting the same element using manual offsets