所以我传递了一个3乘3的浮点数组。函数foo将为每个指针分配内存。这是代码。
#include <stdio.h>
#include <stdlib.h>
void foo(float ***A);
int main(int argc, char **argv) {
float* A[3][3];
foo(&A);
}
void foo(float ***A) {
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
A[i][j] = malloc(2*sizeof(float));
A[i][j][0] = 21;
}
}
}
为什么这不起作用?它会引发以下错误:
C:\Users\tony\Code\MPI>gcc test.c
test.c: In function 'main':
test.c:8: warning: passing argument 1 of 'foo' from incompatible pointer type
test.c:4: note: expected 'float ***' but argument is of type 'float *** (*)[3][3]'
因此,如果我调用foo(A)而不是foo(&amp; A),我会收到此错误:
C:\Users\tony\Code\MPI>gcc test.c
test.c: In function 'main':
test.c:8: warning: passing argument 1 of 'foo' from incompatible pointer type
test.c:4: note: expected 'float ***' but argument is of type 'float * (*)[3]'
答案 0 :(得分:1)
如果要将二维数组传递给函数:
int labels[NROWS][NCOLUMNS];
f(labels);
函数的声明必须匹配:
void f(int labels[][NCOLUMNS])
{ ... }
或
void f(int (*ap)[NCOLUMNS]) /* ap is a pointer to an array */
{ ... }
答案 1 :(得分:1)
float* A[3][3];
是一个2D数组指针。
但是你传递A的地址并将其作为float ***
接收。所以错误。
将其作为foo(A);
传递,并将函数原型更改为
void foo(float* A[][3]);
此外,typeof
应为sizeof
。
A[i][j] = malloc(2*sizeof(float));
答案 2 :(得分:1)
你可以尝试这个:
#include <stdio.h>
#include <stdlib.h>
void foo(float *(*A)[3][3]);
int main(int argc, char **argv) {
float* A[3][3];
foo(&A);
return 0;
}
void foo(float *(*A)[3][3]) {
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
(*A)[i][j] = malloc(2*sizeof(float));
(*A)[i][j][0] = 21;
}
}
}
如果您不想在函数中更改变量本身的值,则无需将该变量的地址传递给此函数。因此,这个更简单的版本也适用于这种情况:
#include <stdio.h>
#include <stdlib.h>
void foo(float *A[3][3]);
int main(int argc, char **argv) {
float* A[3][3];
foo(A);
return 0;
}
void foo(float *A[3][3]) {
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
A[i][j] = malloc(2*sizeof(float));
A[i][j][0] = 21;
}
}
}