簡體   English   中英

我可以使用變量來指定結構成員數組的大小嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM