【问题标题】:I am having trouble passing a multidimensional variable array to a function in C using malloc()我在使用 malloc() 将多维变量数组传递给 C 中的函数时遇到问题
【发布时间】:2014-03-05 00:48:02
【问题描述】:

这段代码应该在 main 中创建一个数组,然后打印它,但每次我运行它时,我都会得到一个全为 0 的数组

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

void print(float **A, int w, int h){
  int i, j;

  A = (float*) malloc(w*h*sizeof(float));

  for (i=0;i<h;i++){
    A[i] = (float*) malloc(w*sizeof(float));
  }

  for (i=0; i<h; i++){
    for(j=0; j<w; j++){
      printf("%f ", A[i][j]);
    }

    printf("\n");
  }
}

int main(void) {

    int i;
    int x_dimension=3;
    int y_dimension=2;
    float arr [3][2]={};
    arr[0][0]=16.2;

    print(arr,x_dimension,y_dimension);

    return 0;
}

【问题讨论】:

  • 为什么还要在print() 中分配内存?毕竟,您只是在打印它的内容。
  • float[M][N]float** 相同。

标签: c pointers dynamic multidimensional-array malloc


【解决方案1】:

您在 print 函数中重新分配它,这应该可以工作:

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

void print(float * A,int h, int w){
  int i,j;
  for (i=0;i<h;i++){
    for(j=0;j<w;j++){
      printf("%f ",A[i * w + j]);
    }
    printf("\n");
  }
}

int main(void) {
    int i;
    const int x_dimension=3;
    const int y_dimension=2;
    float arr[x_dimension][y_dimension];
    arr[0][0]=16.2;
    print(arr,x_dimension,y_dimension);
    return 0;
}

请注意,我还在 print 函数中反转了 wh 参数。

【讨论】:

  • 你为什么要歪曲规则,而不是做正确的解决方案并修复函数参数。
  • @self。你什么意思?
  • @jlhonora 你能解释一下你的 printf 语句是如何工作的,你有什么理由改变 w 和 h 吗?
【解决方案2】:

我想你看到 arr 没有初始化:

  1. 分配内存?
  2. 默认值。
  3. float arr[][] 和 float **arr 不同,你应该这样使用:float (*A)[2]

但是在你的 main 函数中,你已经完成了 alloc 的工作。 arr 在堆栈中分配。 所以在你的打印函数中,你要做的只是打印结果或者初始化每个项目的值。

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

void printArr(float (*A)[2],int w, int h){
    int i,j;
    //Wrong, A has been alloced.
    /*
       A = (float*) malloc(w*h*sizeof(float));
       for (i=0;i<h;i++){
       A[i]=(float*) malloc(w*sizeof(float));
       }
       */
    for (i=0;i<h;i++){
        for(j=0;j<w;j++){
            printf("%f ",A[i][j]);
        }
        printf("\n");
    }
}

void printPointer(float *A,int w, int h){
    int i,j;
    //Wrong, A has been alloced.
    /*
       A = (float*) malloc(w*h*sizeof(float));
       for (i=0;i<h;i++){
       A[i]=(float*) malloc(w*sizeof(float));
       }
       */
    for (i=0;i<h;i++){
        for(j=0;j<w;j++){
            printf("%f ",*((A+i*h)+j));
        }
        printf("\n");
    }
}
int main(void) {
    int x_dimension=3;
    int y_dimension=2;

    //By Array, Array is not a pointer, but is a structure
    float arr[2][3] = {};
    //Only [0][0] item has been initialized
    arr[0][0]=16.2f;
    printArr(arr,x_dimension,y_dimension);

    //By pointer
    float* arrp = (float*)calloc(x_dimension*y_dimension,sizeof(float));
    *arrp=16.2f;
    printPointer(arrp,x_dimension,y_dimension);


    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2014-11-19
    相关资源
    最近更新 更多