我正在尝试共享类似于以下示例的结构:

typedef struct {
    int *a;
    int b;
    int c;
} example;


我正在尝试在进程之间共享此结构,我发现的问题是,当我使用malloc初始化'a'时,将无法从第二个进程内访问该数组。
是否可以将此动态数组添加到内存映射文件中?

最佳答案

你可以拥有它

typedef struct {
    int b;
    int c;
    int asize; // size of "a" in bytes - not a number of elements
    int a[0];
} example;

/* allocation of variable */
#define ASIZE   (10*sizeof(int))
example * val = (example*)malloc(sizeof(example) + ASIZE);
val->asize = ASIZE;

/* accessing "a" elements */
val->a[9] = 125;


技巧是在结构的末尾将大小为a的数组设为零,将malloc设置为大于结构的大小再加上a的实际大小。

您可以将此结构复制到映射文件。您应该复制sizeof(example)+val->asize个字节。另一方面,只需读取asize,您就会知道应该读取多少数据-因此,读取sizeof(example)字节,realloc并读取其他asize字节。

关于c - C Windows-内存映射文件-共享结构中的动态数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29731266/

10-10 11:18