[英]Can I use a variable to specify the size of a struct member array?
我試圖在結構中表示HD頁面。 下面的代碼不起作用,因為page_size不是常量。
int page_size = 4096;
struct page {
char data[page_size];
/* some methods */
}
由於我正在構建並隨機訪問頁面數組,如果我可以將頁面視為大小為page_size的固定長度結構,那將是很好的。 如果可能的話,我想在程序開始時從配置文件中讀取page_size,或者從操作系統獲取它(例如,Windows上的GetDiskFreeSpace())。 顯然,只有少數現實的頁面大小,但我想不出一種方法來利用它。
任何幫助表示贊賞。
坦率
不。 你發現,你不能。 編譯器需要可靠且經常地知道其數據結構的大小才能完成其工作。
我假設頁面數據不是你的唯一的內容struct
。 您可能在頁面中有一些關於頁面的標題/管理信息以及文本。
常見的解決方案是讓你的struct包含一個指向實際文本的char *
。 然后,該文本可以在大小寫的內存malloc()
'd或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);
每頁有一個指針的開銷(當然可以接受),並且您的頁面在內存中是物理上連續的。 還有什么可以問的? :)
{C++}
如果你想在運行時確定大小,為什么不能使用std::vector
?
int page_size = 4096; //or any variable
class page{
std::vector<char> PAGE;
public:
page():PAGE(page_size){}
};
C和C ++要求數組長度為編譯時常量。 C99向C引入了可變長度數組 ,但我不確定你是否可以在結構中使用它們。
[C ++]
你可以這樣做:
int page_size = 4096;
struct page
{
char *pData;
page() : pData(new char[page_size])
{
}
~page()
{
delete[] pData;
}
/* some methods */
}
代替。
您可以使用
#define PAGE_SIZE 4096
struct page {
char data[PAGE_SIZE];
/* some methods */
}
使用autoconf automake,您可以自定義PAGE_SIZE
如果它只是你想要的文字,那么最簡單的方法就是
struct page {
std::string data;
/* some methods */
}
這就是我問C或C ++的原因,因為這在C中不可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.