【问题标题】:Printing content of 2D array (pointer of pointer)打印二维数组的内容(指针的指针)
【发布时间】:2014-12-05 18:30:52
【问题描述】:

我定义了一个函数,用于通过指针初始化一个二维数组,同时用随机值对其进行初始化。

然后我打印它,我没有看到预期值。我的代码中的错误在哪里?我已经找了好几个小时了。

#define MATRIX_SIZE 3

int **initialize_matrix(size_t m, size_t n){
    int i1,i2;

    int **ptr1=(int **)malloc(sizeof(int *)*m*n);
    int *ptr2=(int *)malloc(sizeof(int)*m);

    srand(time(0));
    for(i1=0;i1<MATRIX_SIZE;i1++){
        for(i2=0;i2<MATRIX_SIZE;i2++){
            ptr2[i2]=rand()%10;
            printf("%d ",ptr2[i2]);
        }
     }

    for(i1=0;i1<MATRIX_SIZE;i1++){
        ptr1[i1]=ptr2+m*i1;
    }
    printf("\nFinished generating\n");

    return ptr1;
}

void print_matrix(int** matrix_to_print){
    int i1,i2;

    for(i1=0;i1<MATRIX_SIZE;i1++)
    for(i2=0;i2<MATRIX_SIZE;i2++){
        printf("%d ",matrix_to_print[i1][i2]);
        if(i2==MATRIX_SIZE-1)
            printf("\n");
      }

}

打印出来:

2 4 8
0 6 7 6 4 4 完成生成 矩阵 1: 6 4 4
135113 0 0 0 0 0

【问题讨论】:

  • int **ptr1=(int **)malloc(sizeof(int *)*m*n);int *ptr2=(int *)malloc(sizeof(int)*m); :应该是int **ptr1=(int **)malloc(sizeof(int *)*n);int *ptr2=(int *)malloc(sizeof(int)*m*n);。为什么MATRIX_SIZE在函数initialize_matrix(size_t m, size_t n)中使用?

标签: c arrays pointers memory-management


【解决方案1】:

示例代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MATRIX_SIZE 3

int **initialize_matrix(size_t m, size_t n){
//make dynamic 2D array like int a[m][n]
    int i1,i2;

    //There is no need to cast the return value of malloc in C
    int **ptr1=(int **)malloc(sizeof(int *)*m);

    srand(time(0));
    for(i1=0; i1<m; i1++){
        ptr1[i1] = (int*)malloc(sizeof(int)*n);
        for(i2=0; i2 < n; i2++){
            ptr1[i1][i2]=rand()%10;
            printf("%d ",ptr1[i1][i2]);
        }
     }
    printf("\nFinished generating\n");

    return ptr1;
}

void print_matrix(int** matrix_to_print, size_t m, size_t n){
    int i1,i2;

    for(i1=0;i1<m;i1++){
        for(i2=0; i2<n; i2++)
            printf("%d ", matrix_to_print[i1][i2]);
        printf("\n");
    }
}

int main(){
    int **p = initialize_matrix(MATRIX_SIZE, MATRIX_SIZE);
    print_matrix(p, MATRIX_SIZE, MATRIX_SIZE);
    {   //deallocate
        int i;
        for(i = 0; i < MATRIX_SIZE; ++i)
            free(p[i]);
        free(p);
    }

    return 0;
}

【讨论】:

  • 这解决了我最初的问题。不过,我想再问一件事。如果我从main() 调用initalize_matrix(...) 两次以生成两个不同的矩阵,然后从这两个操作中调用三分之一,我该怎么做?在调用initialize_matrix() 之后我不能freeright 所以生成的2 个矩阵最终是相同的......
  • @JoãoPereira int **p1 = initalize_matrix(...);int **p2 = initalize_matrix(...);int **p3 = initalize_matrix(...);, p3[x][y]=p1[x][y]+p2[x][y];...
【解决方案2】:
//here is a possible code snippet to address your problem.
//it is commented as to what is being done.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// prototypes
void cleanUp( int **, int );
int **initialize_matrix( size_t, size_t );

int **initialize_matrix(size_t width, size_t height) // <-- use meaningful variable names
{
    int i; // outer loop index
    int j; // inner loop index

    // set initial array of pointers to integer
    int **my2dMatrix = calloc(height, sizeof(int*) ); // dont cast the returned value from malloc family
    if( NULL == my2dMatrix )
    { // then calloc failed
        perror( "calloc failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, malloc successful

    // set pointer array to point to arrays of integers
    for( i=0; i<height; i++)
    {
        my2dMatrix[i] = malloc(sizeof(int)*width);
        if( NULL == my2dMatrix[i] )
        { // then malloc failed
            perror( "malloc failed" );
            cleanUp( my2dMatrix, height );
            exit( EXIT_FAILURE );
        }

        // implied else, malloc successful

    } // end for

    // fill array with random values
    srand(time(0));
    for(i=0; i<height; i++ )
    {
        for(j=0;j<width;j++)
        {
            my2dMatrix[i][j] = rand()%10;
            printf("%d ",my2dMatrix[i][j]);
        } // end for
    } // end for

    printf("\nFinished generating\n");

    return my2dMatrix;
} // end function: initialize_matrix

void cleanUp( int **my2dMatrix, int height )
{
    int i; // loop copunter
    for( i=0; i < height; i++ )
    {
        // free each row memory allocation
        free( my2dMatrix[i]); // ok to pass NULL to free,
                        // which is why initial pointer array created with calloc())
    }
    // free top level memory allocation
    free( my2dMatrix );
}

【讨论】:

  • 次要:即使 OP 做到了,intsize_t 的混合使用也存在问题。编译器肯定警告过for( i=0; i&lt;height; i++)。建议始终使用size_tsize_t i,j;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 2012-01-26
相关资源
最近更新 更多