簡體   English   中英

在c中填充沒有calloc和malloc的數組?

[英]populating array without calloc and malloc in c?

我有看起來像的代碼

int main(int argc, char *argv[]){
char ***matrix;
matrix = calloc(2, sizeof(char **));
for (int i=0; i<2; i++){
    matrix[i] = calloc(ROWS+2, sizeof(char*));
    for (int j=0; j<COLS; j++){
        matrix[i][j] = malloc(COLS+2);
        memset(matrix[i][j], (int)DEFAULT, COLS+2);
    }
}

有沒有辦法在不使用 malloc 和 calloc 的情況下做類似的事情? 例如,在一維數組的情況下,我知道你可以做這樣的事情

unsigned char malloc_data[MAX_SIZE];
size_t malloc_used;  /* automatically initialized to zero */

void *stack_malloc(size_t size) {
void *p = &malloc_data[malloc_used];
if(size + malloc_used > MAX_SIZE) return 0;  /* out of memory */
malloc_used += size;
return p;
}

或者像這樣的東西

static char *allocp = allocbuf[0];
if (allocbuf + ALLOCSIZE - allocp >= n) { /* it fits */ 

if (p >= allocbuf && p < allocbuf + ALLOCSIZE)

我想嘗試使用堆棧變量和臨時文件而不是動態內存分配方式。 然而,當我試圖考慮如何將這些類型的方法應用於我的三維感時,我的頭開始旋轉。 請幫我澄清事情

假設您想保留三重指針的使用,可以在堆棧上分配存儲並像這樣初始化:

char ***matrix;
char **mats_[2];
char *mat_rows_[2][ROWS+2];
char mat_cols_[2][ROWS+2][COLS+2];
matrix = &mats_[0];
for (int i = 0; i < 2; i++) {
    matrix[i] = &mat_rows_[i][0];
    for (int j = 0; j < ROWS+2; j++) {
        matrix[i][j] = &mat_cols_[i][j][0];
        memset(matrix[i][j], (int)DEFAULT, COLS+2);
    }
}

您還可以將matrix定義為char **的數組 [2] 而不是單個char *** ,這將允許您消除mats_變量:

char **matrix[2];
char *mat_rows_[2][ROWS+2];
char mat_cols_[2][ROWS+2][COLS+2];
for (int i = 0; i < 2; i++) {
    ...

在下面的評論中,OP 詢問是否需要memset mat_cols_[2][ROWS+2][COLS+2]所有元素都需要設置為相同的值DEFAULT 如果DEFAULT可以用0替換,這很容易通過定義mat_cols_和一個幾乎所有東西都默認為 0 的初始化程序來實現:

char mat_cols_[2][ROWS+2][COLS+2] = { 0 };

如果DEFAULT不能用 0 替換,那么唯一的方法就是讓初始化程序顯式地為所有元素提供值,這具有可維護性問題,因為維度是根據宏ROWSCOLS GNU C 編譯器 (GCC) 對 C 語言指定的初始化程序進行了擴展,允許將一系列數組元素初始化為相同的值。 可以按如下方式使用:

char mat_cols_[2][ROWS+2][COLS+2] =
    {[0 ... 1] =
        {[0 ... ROWS+2-1] =
            {[0 ... COLS+2-1] = DEFAULT}
        }
    };

暫無
暫無

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

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