如何在C中更改2d数组的内容?

时间:2019-04-11 00:30:53

标签: c arrays pointers multidimensional-array memory-address

我正在解决一个必须转置矩阵的问题。我正在传递原始矩阵的地址,但是一旦执行函数,它就不会改变!

我试图在转置函数中添加一个矩阵的*,认为它会指向整个2d数组,但是没有用。

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

void transpose(int *r,int *c, int **matrix);
void printMatrix(int r,int c, int **matrix){
  for(int i=0;i<r;i++){
      for(int j=0;j<c;j++)
        printf("%2d ",matrix[i][j]);
      printf("\n");  
  }
}

int main() {

  int **matrix;
  int r =3;
  int c =2;
  matrix = (int**) malloc(r*sizeof(int*)); 
  for(int i=0;i<r;i++)
    matrix[i] = (int*) malloc(c*sizeof(int));

   for(int i=0;i<r;i++){
      for(int j=0;j<c;j++)
        matrix[i][j] = (3*i+2*j)%8+1; 
  }
  printf("Before transpose:\n");
  printMatrix(r,c,matrix);

   transpose(&r, &c ,matrix);

  printMatrix(r,c,matrix);



return 0;
}

void transpose(int *r,int *c, int **matrix){
  int newR = *c;
  int newC = *r;
  int **newMatrix;

  newMatrix = (int**) malloc(newR*(sizeof(int*)));
  for(int i=0; i<newR;i++)
    newMatrix[i] = (int*) malloc(newC*(sizeof(int)));
  for(int i=0; i<newR; i++)
    for(int j=0;j<newC;j++)
      newMatrix[i][j] = matrix[j][i];

  *c = newC;
  *r = newR;



  matrix = (int**) malloc((*r)*sizeof(int*)); 
  for(int i=0;i<*r;i++)
    matrix[i] = (int*) malloc((*c)*sizeof(int));
  for(int i=0; i<newR; i++){
    for(int j=0;j<newC;j++){
      matrix[i][j] = newMatrix[i][j];
    }
 printf("\n");  
  }
}

我有这个矩阵

1 3
4 6
7 1

并希望获得

1 4 7 
3 6 1

但是我得到了

1 3 0
1 4 0

2 个答案:

答案 0 :(得分:1)

您似乎忘了要做的实际上只是使用转置矩阵。我要做的就是更改函数签名,并返回您已经分配和操作的矩阵,然后得到所需的输出。

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

int** transpose(int *r,int *c, int **matrix);

void printMatrix(int r, int c, int **matrix) {
    for (size_t i = 0; i < r; ++i){
        for (size_t j = 0; j < c; ++j) {
            printf("%2d ",matrix[i][j]);
        }

        printf("\n");  
    }
}

int main()
{
    int r = 3;
    int c = 2;

    int **matrix = calloc(sizeof(int*), r);

    for (size_t i = 0; i < r; ++i) {
        matrix[i] = calloc(sizeof(int), c);
    }

    for (size_t i = 0; i < r; ++i) {
        for (size_t j = 0; j < c; ++j) {
            matrix[i][j] = (3 * i + 2 * j) % 8 + 1; 
        }
    }

    printf("Before transpose:\n");
    printMatrix(r, c, matrix);

    int** newMatrix = transpose(&r, &c ,matrix);

    printMatrix(r, c, newMatrix);

    return EXIT_SUCCESS;
}

int** transpose(int *r, int *c, int **matrix) {
    int newR = *c;
    int newC = *r;

    int **newMatrix = calloc((sizeof(int*)), newR);

    for (size_t i = 0; i < newR; ++i) {
        newMatrix[i] = (int*) malloc(newC*(sizeof(int)));
    }

    for (size_t i = 0; i < newR; ++i) {
        for (size_t j = 0; j < newC; ++j) {
            newMatrix[i][j] = matrix[j][i];
        }
    }

    *c = newC;
    *r = newR;

    matrix = calloc(sizeof(int*), *r); 

    for (size_t i = 0; i < *r; ++i) {
        matrix[i] = calloc(sizeof(int), *c);
    }

    for (size_t i = 0; i < newR; ++i) {
        for (size_t j = 0; j < newC; ++j) {
            matrix[i][j] = newMatrix[i][j];
        }

        printf("\n");  
    }

    return newMatrix;
}

输出:

1 4 7
3 6 1

我做了一些更改,尤其是因为我更喜欢使用calloc而不是malloc,因为它会将新分配的内存归零,并且有一个专用参数来表示请求的内存大小,从语义上来说,这是一个更好的主意。

作为旁注,您不必在C中强制转换malloc的结果。我认为,与其他人相比,我倾向于对此感到更强烈,因为代码噪音,尤其是当您在C中工作是您自己最糟糕的事情之一。这是一个很好的例子,因为我所做的只是重新格式化您的代码,而答案就在那里。也不要对空格太小气;确实确实有所作为。

无论如何,即使您基本上完成了所有工作,我也希望这有所帮助。

答案 1 :(得分:-1)

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

void transpose(int *r,int *c, int ***matrix);
void printMatrix(int r,int c, int **matrix){
    int i=0,j=0;
  for(i=0;i<r;i++){
      for(j=0;j<c;j++)
        printf("%2d ",matrix[i][j]);
      printf("\n");  
  }
}

int main() {

  int **matrix;
  int r =3;
  int c =2;
  int i=0,j=0;

  matrix = (int**) malloc(r*sizeof(int*)); 
  for(i=0;i<r;i++)
    matrix[i] = (int*) malloc(c*sizeof(int));

   for(i=0;i<r;i++){
      for(j=0;j<c;j++)
        matrix[i][j] = (3*i+2*j)%8+1; 
  }
  printf("Before transpose:\n");
  printMatrix(r,c,matrix);

   transpose(&r, &c, &matrix);

  printMatrix(r,c,matrix);



return 0;
}

void transpose(int *r,int *c, int ***matrix){
  int newR = *c;
  int newC = *r;
  int **newMatrix;
  int i=0,j=0;

  newMatrix = (int**) malloc(newR*(sizeof(int*)));
  for(i=0; i<newR;i++)
    newMatrix[i] = (int*) malloc(newC*(sizeof(int)));
  for(i=0; i<newR; i++)
    for(j=0;j<newC;j++) {
      newMatrix[i][j] = (*matrix)[j][i];
    }

  *c = newC;
  *r = newR;

  // free matrix..

  *matrix = newMatrix;


  /*matrix = (int**) malloc((*r)*sizeof(int*)); 
  for(i=0;i<*r;i++)
    matrix[i] = (int*) malloc((*c)*sizeof(int));
  for(i=0; i<newR; i++){
    for(j=0;j<newC;j++){
      matrix[i][j] = newMatrix[i][j];
    }
 printf("\n");  
  }*/

}