簡體   English   中英

如何在不使用C的情況下使用變量但不使用malloc()聲明數組?

[英]How can I declare an array with a variable, but without using malloc() in C?

因此,我必須創建一個2D數組,該數組將用於打印直方圖。 我知道數組將有52個元素寬,但是數組的高度將等於max + 1 ,每次調用它所包含的函數時,數組的高度都會不同。 理想情況下,該行將完成以下功能:

char histPlot[max+1][52] = "";

但是,在編寫代碼時,我了解到C或至少是我的編譯器不允許在沒有常量值的情況下聲明數組。 我正在編寫此代碼的班級教授尚不清楚我們是否可以使用malloc()進行此分配。 假設我不能使用malloc() ,有什么方法可以創建數組histPlot[][]使其具有正好為max + 1的高度?

編輯:所以我已經接受了沒有使用malloc()或某些類似函數就無法完成我要嘗試執行的操作的真正方法。 我確實設法找到了一個根本不涉及這些功能或2D陣列的解決方案,但是感謝那些回答!

從根本上說,在C99之前,如果它是可變長度數組,則需要動態分配。 這意味着malloc或類似功能之一。

如果使用C99,則可以直接聲明它。

一些系統提供了alloca功能。 (但是,這不是標准C。)

除此之外,沒有真正的方法來獲取動態大小的數組。

我可以提供以下或多或少的愚蠢的解決方法:

  • 使用callocrealloc分配內存(遵循不能使用malloc但不能使用精神的規則)
  • ...或mmap (如果您的平台具有該功能)
  • 如果不一定是真實的數組,請使用一個臨時文件來存儲數據(通過fseekfreadfwrite訪問)
  • 如果您可以改用鏈表,則可以通過遞歸函數調用在堆棧上構建其中之一

在C99中,允許您使用直到運行時才可用的值來聲明可變長度數組。 但是,您不能使用固定的初始化程序。 那是什么意思

char histPlot[max+1][52] = "";

您將必須編寫如下內容:

char histPlot[max+1][52];
for (int i=0; i<=max; i++) {
    strcpy(histPlot[i], "");
}

注意,在for()語句中聲明int的for()是另一個C99擴展。 要成功編譯此代碼,您可能必須在命令行中添加-std=c99之類的內容。

我還應該指出,堆上的可用空間比堆棧上的可用空間大得多。 如果需要聲明一個大數組(即,如果max的值大於幾百),那么使用malloc()在堆上創建一個數組將是有意義的。

如果它不太大,則可以在堆棧上的函數中聲明它。

#include <stdio.h>
void a(int b,int c) {
    char d[b][c];
    d[0][1] = 'a';
    printf("%c\n",d[0][1]);
    return;
}
int main() {
    a(8,14);
    return 1;
}

輸出:a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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