我正在学习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;
}
为什么这不能编译?它抱怨matrix[i][j]
不是指针/数组。但我刚刚宣布它为指针上面的六行......
答案 0 :(得分:7)
它是一维数组,因此您必须将其视为一维数组,而不是2D数据。
您当然可以将n x n
元素存储在其中:
matrix[i * n + j] = rand() % 10;
如果您愿意,可以按照How do I work with dynamic multi-dimensional arrays in C?
中给出的建议设置2D结构顺便说一句,每次创建矩阵时,您可能都不想调用srand()
。如果你快速连续两次致电create_matrix()
,你可能会得到相同的&#34;随机&#34;矩阵。在程序开始时调用srand()
一次。
答案 1 :(得分:2)
您已将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);
// ....
}
答案 2 :(得分:1)
您将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;
}
}
答案 3 :(得分:1)
它真正抱怨的是,矩阵[i]不是指针/数组。您只创建了一维数组,您可以直接访问它,如
matrix[i * n + j] = rand() % 10;
或者继续,干净利落地重做阵列,这样它就会是二维的。您需要使用指向指针的指针(对于行中的每个成员 - 一行)
int **matrix
但你必须通过
循环*matrix
单独对每行进行malloc。
查看二维数组。
//编辑:另外,将srand()移动到文件的开头。你不想对每个新矩阵进行srand()。
答案 4 :(得分:1)
你想要两个维度,那么你需要一个指向指针的指针(不是一个指针):
#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;
}