[英]using flexible array member with mmap
我无法访问使用mmap初始化的全局结构指针。 尝试在抛出segfaults中声明的结构之外的函数中访问该结构的成员。
结构:
typedef struct foo {
uint32_t size;
bar_t array[0];
} foo_t;
初始化:
foo_t* foo; // global
static void* init_function(...) {
fd = open(filename, O_CREAT | O_WRONLY, 0644);
write(...);
lseek(...);
write(...);
foo = mmap(0, BIG_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
foo->size = 0;
}
是什么导致段错误:
static int another_function(...) {
if (foo->size == 0) {...} //foo->size causes it
}
BIG_SIZE是一个定义的值,应该足够满足我的需求。
无论如何,我对(...)表示歉意,但这是出现问题的地方。 我没有碰运气就看过mmap文档和可变长度方法。 提前致谢!
您并没有向我们显示所有内容,但是似乎您只是分配了全局变量,但没有初始化映射区域的内容。 如果文件是新创建的,则至少应在某个地方给它一个foo->size = 0
,否则,您应该使用ftruncate
而不是fseek write
序列来保证块(包括size
)被填充为0
。
首先检查mmap是否真的成功:
foo = mmap(...);
if(MAP_FAILED == foo){//没有记忆给我...}
而且,如果我没记错的话,文件的长度必须至少为BIG_SIZE
,否则mmap
将会失败-但我可能在那部分上是错误的...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.