【问题标题】:Create a dynamic array and initialize it创建一个动态数组并初始化它
【发布时间】:2026-02-17 02:45:01
【问题描述】:

对于一个学校项目,我们必须用 c 创建一个迷宫,我是该语言的初学者,所以我在一开始就卡住了:动态创建一个数组...

我阅读了有关 malloc 和 calloc 的信息,并尝试使用它但没有成功...

这是我的代码:

/* define maze structure */

typedef struct _maze_t {
    int m, n;
    char **array;
} Maze;

void constructorArray(int m,int n)
{ 
    array = malloc(m * sizeof *array);

    for(i=0;i<m;i++){
        array[i]=(char *) malloc(n*sizeof(char)); 
    }
    array = calloc(m, sizeof *array);

    for (i=0; i<m; i++){
      array[i] = calloc(n, sizeof *(array[i]));
    }   
}
void createMaze(int ncolumn, int mlign)
{    
    int m=mlign;
    int n=ncolumn;
    int counter=0; 

    constructorArray(m,n) ;     

    char **array;            

    for(i=0;i<m;i++)
    {
        for(y=0;y<n;y++)
        {
            array[i][y]=counter;
            counter++;
        }
    }
}

int main()
{
    createMaze(100,100);    
    return 0;
}

有人可以向我解释一下如何正确操作吗?

【问题讨论】:

  • 1) 我看不到main() 2) 缺少返回类型是糟糕学习来源的标志。
  • array=(char **) malloc(1m*sizeof(char *)); 应该是 array = malloc(m * sizeof *array);1m 是语法错误。
  • 鉴于1m 之类的拼写错误,看来此代码是手动重新输入的,而不是复制/粘贴的。因此,它仅近似于实际运行的代码。这意味着您的结果将无法可靠地复制。
  • @MichaelWalz 19 年前我在我工作的公司争论说我们应该停止使用奇怪的参数宏,我们必须允许我们的代码在 K&R 和 ANSI C 中编译。所以是的,人们不应该使用它 20 年 IMO。

标签: c malloc calloc


【解决方案1】:

看来你有一些不正确的看法。

首先,您没有正确声明您的 C 函数:

constructorArray(m,n)

应该是:

void constructorArray(int m, int n)

那么看来你认为在 C 中会自动调用构造函数,其实不然,所以在CreateMaze 中简单地写array[m][n] 是行不通的。你应该写:

char **array;    // it will be allocated dynamically

然后有你的功能:

char **constructorArray(int m, int n)
{ 
    char **array= malloc(m*sizeof(char *));

    for(int i=0; i<m; i++)
        array[i]= malloc(n*sizeof(char));

    return array;
}

你现在可以称之为:

char **array= constructorArray(m, n);

注意:您对数组的使用表明整数数组可能更合适。

【讨论】: