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

时间:2010-07-16 09:16:35

标签: c++ c arrays

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

int page_size = 4096;

struct page {

  char data[page_size];

  /* some methods */
}

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

感谢任何帮助。

6 个答案:

答案 0 :(得分:4)

不。你发现,你不能。编译器需要可靠且经常地知道其数据结构的大小,才能完成其工作。

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

通常的解决方案是让你的struct包含指向实际文本的char *。然后,该文本可以在您需要的任何大小的内存malloc()'或calloc()中。唉,这意味着每当你进行移动结构的操作时,你必须记住将外部文本与结构一起移动,并且当你摆脱结构时,内存管理文本...通常的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);

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

答案 1 :(得分:2)

{C++}

如果要在运行时确定大小,为什么不能使用std::vector

int page_size = 4096; //or any variable

class page{

    std::vector<char> PAGE;
    public:

    page():PAGE(page_size){}
};

答案 2 :(得分:1)

[C ++]

你可以这样做:

int page_size = 4096;

struct page 
{
    char *pData;
    page() : pData(new char[page_size])
    {
    }
    ~page()
    {
        delete[] pData;
    }

  /* some methods */
}

相反。

答案 3 :(得分:0)

C和C ++要求数组长度为编译时常量。 C99向C引入了variable length arrays,但我不确定你是否可以在结构中使用它们。

答案 4 :(得分:0)

如果它只是你想要的文字,最简单的方法可能是

struct page {

  std::string data;

  /* some methods */
}

这就是我问C或C ++的原因,因为这在C中不可用。

答案 5 :(得分:-1)

你可以使用

#define PAGE_SIZE 4096

struct page {

  char data[PAGE_SIZE];

  /* some methods */
}

使用autoconf automake,您可以自定义PAGE_SIZE