[英]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 替換,那么唯一的方法就是讓初始化程序顯式地為所有元素提供值,這具有可維護性問題,因為維度是根據宏ROWS
和COLS
。 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.