C 对于mmaped结构,静态数组更改为动态数组

C 对于mmaped结构,静态数组更改为动态数组,c,arrays,rtos,C,Arrays,Rtos,我有一个包含如下数组元素的结构 #define SIZE 20 typedef struct { int currentindex; int array[SIZE]; } tempstruct; int main() { int fd; tempstruct *ptr = NULL; fd = shm_open("/TESTPROG", O_RDWR | O_CREA

我有一个包含如下数组元素的结构

    #define SIZE 20
    typedef struct
    {
        int currentindex;
        int array[SIZE];
    } tempstruct;

    int main()
    {
        int fd;
        tempstruct *ptr = NULL;
        fd = shm_open("/TESTPROG", O_RDWR | O_CREAT, 0666);
        ptr = mmap(0,sizeof(tempstruct),PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
        /* 
        So in case SIZE is not compile time constant but another int then I do this
        ptr = mmap(0,sizeof(tempstruct),PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
        ptr.array = (int*)malloc(sizeof(int)*SIZE);
    */
        return 0;
    }
如您所见,我使用
mmap
在共享内存区域上分配此
tempstruct
的实例,但现在由于一些更改,我希望动态分配
tempstruct
结构的数组元素,因为
大小
将不是编译时常量。那么上述程序是否仍然有效?就像我可以在堆上分配数组,然后
mmap
将它分配到共享内存,这样另一个进程中的数组会指向同一堆区域吗?我想没有,所以请建议一些更好的方法


谢谢

这里有一种解决方法:

typedef struct
{
    int currentindex;
    int array[0];
}
tempstruct;

int main()
{
    ...
    int totalSize = sizeof(tempstruct) + sizeof(int) * numOfElements;
    ptr = mmap(0, totalSize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    ...
}

请注意,您将无法正确使用
tempstruct
实例数组。

malloc内存块将属于执行malloc的进程,而其他进程将无法访问相同的内存(并可能导致异常)

如果不使用GCC或不强制执行ISO C,请使用或使用长度为1的数组,只需创建mmap block sizeof TEMPSSTRUCT+数组大小。因为C不会对数组执行边界检查,所以可以访问结构外部的内存,就像它是结构末尾的数组一样


只有当
array
是结构的最后一个成员,并且该结构没有嵌套在具有以下成员的其他结构中时,此技术才有效。由于
tempstruct
是一个匿名结构,因此在任何情况下都不能这样做。

只需调用
mmap
。它与malloc类似,只是内存来自共享内存块而不是堆。但你也可以用同样的方法把它当作指向结构的指针。我知道,但之前的数组是由mmap分配的,现在数组只是一个指针,我必须使用另一个malloc来分配它,所以有两个内存分配,我不确定第二个内存分配在另一个进程中是否可见?内存分配来自
malloc
对另一个进程不可见,只有来自
mmap
的内存分配。执行此操作后,上述程序即变为不可编译:
ptr.array=。数组是不可分配的,如果这应该是进程之间的内存映射,那么将该成员更改为指针并存储
malloc
结果将对通过该指针寻址的任何其他进程造成严重破坏。简言之,不,它不会起作用。如果您想同时映射
currentIndex
和var len数组,可以使用,但您最好知道自己在做什么。这是一个很好的解决方案,但值得注意的是它是一个GCC扩展,而不是ISO C。但是,如果数组长度始终至少为1,
array[1]
也可以。实际上,您可以完全忽略数组大小,将数组声明为
int-array[]。只要
array
是结构的最后一个成员,并且数组大小不是固定的,这就可以工作。