我现在正在学习C,并试图编写这个函数
int *create_matrix(int n) {
int *matrix = malloc(n*n*sizeof(int));
srand(time(NULL));
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
matrix[i][j] = rand()%10;
}
}
return matrix;
}
为什么编译失败?其对CCD_ 1的抱怨不是指针/数组。但我刚刚声明它是一个指针,在上面六行。。。
这是一个1D数组,所以必须将其视为1D数组而不是2D数组。
当然,您仍然可以在其中存储n x n
元素:
matrix[i * n + j] = rand() % 10;
如果您愿意,可以按照"如何使用C中的动态多维数组?"中给出的建议来设置2D结构?
顺便说一下,您可能不希望每次创建矩阵时都调用srand()
。如果你连续两次快速调用create_matrix()
,你最终可能会得到相同的"随机"矩阵。在程序开始时,请致电srand()
一次。
您已经将matrix
声明为一维数组,而不是二维数组。所以像一样使用它
for(int i=0; i<n*n; ++i)
matrix[i] = //whatever;
如果你真的需要二维阵列,你需要使用双pointers
:
int **matrix = malloc(n * sizeof(int *)); // notice the double pointer
// ....
// ....
for (i = 0; i < n; i++)
{
matrix[i] = malloc(sizeof(int) * n);
// ....
}
您将matrix
声明为一维数组。您需要将数据按原样存储在其中,即
matrix[i * n + j] = rand() % 10;
或者将其声明为二维数组并相应地分配内存。
int** matrix = malloc(n * sizeof(int*));
int i, j;
for (i = 0; i < n; i++) {
matrix[i] = malloc(n * sizeof(int));
for (j = 0; j < n; j++) {
matrix[i][j] = rand() % 10;
}
}
它真正抱怨的是,矩阵[i]不是指针/数组。你只创建了一个一维数组,你可以像一样直接访问它
matrix[i * n + j] = rand() % 10;
或者继续,干净地做,并重做数组,这样它将是二维的。您需要使用指向指针的指针(对于行中的每个成员-一行)
int **matrix
但是你必须通过
*matrix
对每一行进行malloc。
查找二维数组。
//EDIT:另外,将srand()移到文件的开头。您不希望对每个新矩阵都执行srand()。
如果想要两个维度,则需要一个指向指针的指针(而不是单个指针):
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int **create_matrix(int n)
{
int **matrix = malloc(n * sizeof(int *));
srand(time(NULL));
int i, j;
for (i = 0; i < n; i++) {
matrix[i] = malloc(sizeof(int) * n);
for (j = 0; j < n; j++) {
matrix[i][j] = rand()%10;
}
}
return matrix;
}
int main(void)
{
int **matrix = create_matrix(5);
return 0;
}