我知道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个fors,数组。 现在,我想将共享内存中的空间分配给**数组,但我不知道我是否可以这样做:
shmid2 = shmget(IPC_PRIVATE, numCols * sizeof (int*), IPC_CREAT | 0700);
my_array = (double**) shmat(shmid2, NULL, 0);
然后初始化它。它是否正确。如果没有,我怎么能以正确的方式做到这一点?
提前谢谢
答案 0 :(得分:2)
您可以使用单个连续的共享内存段执行此操作。诀窍是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中是不常见的 - 行主要顺序更常见)。
共享共享内存段的独立程序使用matrix
分配自己的索引malloc
- 只共享实际数组。
顺便说一句,您可以对非共享数组使用相同的方法,用普通malloc()
替换共享内存调用。这允许您对整个数组使用单个分配,并为索引使用一个分配,而您的代码每列分配一个。
答案 1 :(得分:0)
我不会这样做,即使使用malloc,因为一旦数组变大,内存碎片化。使用shmget你也会遇到fd问题(每个shmget使用一个fd)。
我建议这样做(未编译,因为没有C编译器关闭)
double* matrix = malloc( sizeof(double)*numrows*numcols);
double value = matrix[actrow*numrows+actcol];
free ( matrix);
您必须记住整个应用中的数字,但这样从内存方面来说它更加干净。此外,现在它是一个很大的块,你可以用shmget / shmat做同样的事情。
答案 2 :(得分:0)
我做到了!我将给出一个结构而不是双数组的示例,但是你明白了。
所以,基本上我想在一段共享内存中分配一个**像素pixel_data(结构image_struct的成员,这里实例化为图像)。
shmid2 = shmget(IPC_PRIVATE, image->width * sizeof (pixel*), IPC_CREAT | 0700);
image->pixel_data = (pixel**) shmat(shmid2, NULL, 0);
/* Allocate integer memory for the second dimension of **pixel_data; */
for (i = 0; i < image->width; i++) {
shmPixelId = shmget(IPC_PRIVATE, image->height * sizeof (pixel), IPC_CREAT | 0700);
image->pixel_data[i] = (pixel *) shmat(shmPixelId, NULL, 0);
if ( image->pixel_data[i]== NULL) {
shmdt(image->pixel_data[i]);
printf("Sh_Memory allocation failed while allocating for pixel_data[i][].\n");
exit(-1);
}
}
我的结构:
typedef struct pixel_t {
byte red;
byte green;
byte blue;
}pixel;
typedef struct {
int width;
int height;
pixel **pixel_data;
} image_struct;
我遵循与malloc维度数组相同的代码,但我使用了共享内存。