这段代码应该在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
函数中重新分配它,这应该可以工作:
#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
函数中的w
和h
参数。
我想你看到arr没有初始化:
- 分配内存?
- 默认值。
- float arr[][] 与 float **arr 不同,你应该这样使用:
float (*A)[2]
但是在您的主要功能中,您已经完成了分配工作。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;
}