动态分配——用户在运行前不知道数组大小的情况下输入元素

Dynamic Allocation - user inputs elements without knowing the array size before runtime

所以在 运行 时我们不知道数组(矩阵)的大小,我希望用户输入数组(矩阵)的元素。这是正确的方法吗?我 return 指向数组的指针也正确吗?

#define MAX_DIM 10
int main(void)
{
    int done = 0;
    int rows, cols;
    float *dataMatrix;

    while (!done)
    {
    // Prompt user to enter row and column dimensions of matrix (must be > 0)
    do
    {
        printf("Enter row dimension (must be between 1 and %d): ", MAX_DIM);
        scanf("%d", &rows);

    } while(rows <= 0 || rows > MAX_DIM);
    do
    {
         printf("Enter column dimension (must be between 1 and %d): ", MAX_DIM);
         scanf("%d", &cols);
    } while(cols <= 0 || cols > MAX_DIM);

    dataMatrix = readMatrix(rows, cols);
    if (dataMatrix == NULL)
    {
        printf ("Program terminated due to dynamic memory allocation failure\n");
        return (0);
    }


float *matrix(int numRows, int numCols)    
{    
    int i=0;
    float **m= NULL;
    m=malloc(numRows*sizeof(float*));
    if(m==NULL)
    {
       printf("error\n");
       exit(1);
    }
    for(i=0;i<numRows;i++)
    {
       m[i]=malloc(numCols*sizeof(float));
    }
    if(m[i-1]==NULL)
    {
       printf("error\n");
       exit(1);
    }
    printf("Enter values for the matrix: ");
    scanf("%f",m[i]);
    return m[i];
}

is this the proper way to do it?

您正朝着正确的方向前进,但还不完全正确。

Also did i return the pointer to the array properly?

没有

您可以使用两种方法之一为矩阵分配内存。

  1. 分配 numRowsfloat* 数量。对于每一行,分配 numColsfloat,然后 return 一个指向 float*s 数组的指针。这是您尝试过的方法,但您没有做对所有事情。

    仔细查看修改后的读取用户数据的代码和return语句。

    float **matrix(int numRows, int numCols)    
    {    
        int i=0;
        float **m = malloc(numRows*sizeof(float*));
        if(m == NULL)
        {
           printf("error\n");
           exit(1);
        }
    
        for(i=0; i<numRows; i++)
        {
           m[i] = malloc(numCols*sizeof(float));
           if(m[i] == NULL)
           {
              printf("error\n");
              exit(1);
           }
        }
    
        printf("Enter values for the matrix: ");
        for (i = 0; i < numRows; ++i )
        {
           for (int j = 0; j < numCols; ++j)
           {
              scanf("%f", &m[i][j]);
           }
        }
        return m;
    }
    
  2. 分配 numRows*numCols 个,共 float 个。将一维数组视为二维数据的持有者。使用适当的偏移量将一维数组视为二维数组。 Return 指向 float 数组的指针。

    float *matrix(int numRows, int numCols)    
    {    
        int i=0;
        float *m = malloc(numRows*numCols*sizeof(float));
        if(m==NULL)
        {
           printf("error\n");
           exit(1);
        }
        printf("Enter values for the matrix: ");
        for (i = 0; i < numRows; ++i)
        {
           for (int j = 0; j < numCols; ++j)
           {
              int index = i*numCols+j;
              scanf("%f", &m[index]);
           }
        }
        return m;
    }