c++ - 我可以使用变量来指定结构成员数组的大小吗?

标签 c++ c arrays

我试图在结构中表示高清页面。下面的代码不起作用,因为 page_size 不是常量。

int page_size = 4096;

struct page {

  char data[page_size];

  /* some methods */
}

因为我正在构建和随机访问页面数组,所以如果我可以将页面视为大小为 page_size 的固定长度结构会很好。如果可能的话,我想在程序开始时从配置文件中读取 page_size,或者从操作系统中获取它(例如,Windows 上的 GetDiskFreeSpace())。显然,只有少数几个实际的页面大小,但我想不出一种方法来利用它。

感谢任何帮助。

弗兰克

最佳答案

没有。正如你所发现的,你不能。编译器需要可靠且持续地了解其数据结构的大小才能完成其工作。

我假设页面数据不是您的 struct 的唯一内容。你可能有一些关于你的页面的标题/管理信息以及文本。

常见的解决方案是让您的结构包含指向实际文本的 char *。然后该文本可以在内存块中 malloc()calloc() 到您需要的任何大小。 las,这意味着无论何时执行移动结构的操作,您都必须记住将外部文本与您的结构一起移动,并且当您摆脱结构时内存管理文本......通常的 C 头痛。


编辑

有一些明智的“标准”方法可以做这种事情。这是一个建议:

typedef char *page_ptr;
int page_size = discover_page_size();
int max_page_count = discover_max_page_count();
int pages_stored = 0;
page_ptr *page_pointers = calloc(max_page_count, sizeof(page_ptr));
char *pages = calloc(max_page_count * page_size, sizeof(char));
page_pointers[0] = pages;
int i;
for (i=1; i<max_page_count; i++) {
    page_pointers[i] = page_pointers[i-1] + page_size;
}

现在您可以将 page_pointers 视为一个页面数组,做类似的事情

read(filedesc, page_pointers[page_count++], page_size);

memmove(page_pointers[69], page_pointers[42], page_size);

每页有一个指针的开销(当然可以接受),并且您的页面在内存中物理上是连续的。你还能问什么? :)

关于c++ - 我可以使用变量来指定结构成员数组的大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3263457/

相关文章:

c++ - gcc/g++ 输出类型

c++ - AVX2 列总体计数算法分别针对每个位列

c - 在 C 中运行以下程序时出现段错误

c - 解析 C 文件

由列和行字符串值键入的 C# 矩阵

php - 检查数组中是否存在任何值

c++ - 多维 vector 和 csv 文件

c - 在C程序中自铸一个void指针指向int是否可能?

javascript - 为什么当我编写array.map,foreach或简单的for时,它在Electron + Javascript中异步运行?

C++ - 更快地向下转换树节点的子节点?