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

问题描述 投票:0回答:2

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

我试图在转置函数中添加*前面的矩阵,认为它将指向整个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
c arrays pointers multidimensional-array memory-address
2个回答
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
投票
#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");  
  }*/

}
© www.soinside.com 2019 - 2024. All rights reserved.