c - 在 mmap 中使用灵活的数组成员

标签 c struct segmentation-fault mmap flexible-array-member

我无法访问我正在使用 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/

相关文章:

c - #define 多个元素用逗号分隔的语句

c++ - 从 cin 读入结构数组时终止输入

ios - 使用各种结构调用 func

c - 在 C 中定义二维 char 数组

c++ - 链接列表释放内存 - 段错误

释放内存的正确方法

c - 为什么 "storage size of ' array' 不是常量”

C 文件解析问题

c - 为什么我在运行程序时收到 "Segmentation Fault"?

使用 GL_ELEMENT_ARRAY_BUFFER 时的 Java GLFW 段错误