出错代码:
#include<stdio.h>
#include<string.h>
#define NUM_NODE 5
int test(float **array,int len)
{
array[0][2]=123.45;
return 0;
}
int main()
{
float num[NUM_NODE][NUM_NODE];
memset(num,0,NUM_NODE*NUM_NODE*sizeof(float));
test(num,NUM_NODE);
return 0;
}
编译提示:expected 'float **' but argument is of type 'float (*)[5]'。
而且传递后的二维指针,如果有赋值操作,则会导致程序崩溃。
但是,将test函数转换为int test(float (*array)[NUM_NODE],int len),警告消失。这充分说明二维数组,同二维指针其实是不一样的。二维数组的类型为float(*)[NUM_NODE]。
而且二维指针的分配内存和二维数组也是不同的,内存分布不同;
int test(float **array,int len)
{
array[0][2]=123.45;
return 0;
}
int main()
{
float **num=NULL;
int i=0;
for(i=0;i<NUM_NODE;i++)
{
num=(float **)malloc(NUM_NODE*sizeof(float*));
}
for(i=0;i<NUM_NODE;i++)
{
num[i]=(float*)malloc(NUM_NODE*sizeof(float));
}
printf("%p,%p\n",num,&num);
float **ptr=num;
ptr[0][1]=123.45;
test(num,NUM_NODE);
return 0;
}
记录在此。我觉的这个问题要是研究明白,需要理解编译原理。