gpt4 book ai didi

c - 如何在 C 中 shmget 和 shmat 双数组?

转载 作者:太空宇宙 更新时间:2023-11-04 03:06:37 26 4
gpt4 key购买 nike

我知道 2D 数组在 C 中可能很奇怪,而使用 malloc,我会做这样的事情:

/* This is your 2D array. */
double** matrix;
/* The size dimensions of your 2D array. */
int numRows, numCols;
/* Used as indexes as in matrix[x][y]; */
int x, y;
/*
* Get values into numRows and numCols somehow.
*/


/* Allocate pointer memory for the first dimension of a matrix[][]; */
matrix = (double **) malloc(numCols * sizeof(double *));
if(NULL == matrix){free(matrix); printf("Memory allocation failed while allocating for matrix[].\n"); exit(-1);}

/* Allocate integer memory for the second dimension of a matrix[][]; */
for(x = 0; x < numCols; x++)
{
matrix[x] = (double *) malloc(numRows * sizeof(double));
if(NULL == matrix[x]){
free(matrix[x]); printf("Memory allocation failed while allocating for matrix[x][].\n");
exit(-1);
}
}

并用 2 个 for 初始化数组。现在,我想将共享内存中的空间分配给一个**数组,但我不知道是否可以这样做:

shmid2 = shmget(IPC_PRIVATE, numCols * sizeof (int*), IPC_CREAT | 0700);
my_array = (double**) shmat(shmid2, NULL, 0);

然后初始化它。它是否正确。如果不是,我怎样才能以正确的方式做到这一点?

提前致谢

最佳答案

你可以用一个连续的共享内存段来做到这一点。诀窍在于 double 值本身存在于共享内存中,但是您的 double * 行指针可以只是普通的 malloc 内存,因为它们'只是共享内存的索引:

double *matrix_data;
double **matrix;
int x;

shmid2 = shmget(IPC_PRIVATE, numRows * numCols * sizeof matrix_data[0], IPC_CREAT | 0700);
matrix_data = shmat(shmid2, NULL, 0);

matrix = malloc(numCols * sizeof matrix[0]);
for(x = 0; x < numCols; x++)
{
matrix[x] = matrix_data + x * numRows;
}

(请注意,这会像您的代码那样按列优先顺序分配索引,这在 C 语言中不常见 - 行优先顺序更为常见)。

共享共享内存段的独立程序各自使用 malloc 分配自己的索引 matrix - 仅共享实际数组。

顺便说一句,您可以对非共享数组使用相同的方法,将共享内存调用替换为普通的 malloc()。这允许您对整个数组使用一个分配,再加上一个索引,而您的代码每列有一个分配。

关于c - 如何在 C 中 shmget 和 shmat 双数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4222258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com