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