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
是结构的最后一个成员,并且数组大小不是固定的,这就可以工作。