C - 使用malloc创建一个数组,然后遍历它

时间:2014-10-15 11:20:36

标签: c arrays loops pointers malloc

我正在学习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]不是指针/数组。但我刚刚宣布它为指针上面的六行......

5 个答案:

答案 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;
}