我无法访问我正在使用 mmap 初始化的全局结构指针。试图在抛出段错误中声明的函数之外的函数中访问该结构的成员。
结构:
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 是一个定义值,应该足够大以满足我的需要。
无论如何,我为 (...)s 道歉,但这就是问题所在。我研究了 mmap 文档和可变长度方法,但没有运气。提前致谢!
最佳答案
您没有向我们展示所有内容,但似乎您只是分配了全局变量,但没有初始化映射区域的内容。你至少应该给它一个
foo->size = 0
某处,如果文件是新创建的,或者您应该使用 ftruncate
而不是 fseek write
序列来保证 block (包括 size
)被 0
填充。
关于c - 在 mmap 中使用灵活的数组成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29937300/