我不确定为什么会这样,我想我正在做的一切正确。也许有人可以帮助我指出正确的方向。
在代码结束时,我得到了“从不兼容的指针类型传递参数1”。有什么问题?
char* fun(char **tab,int n,int m){
char *tab1;
tab1=malloc((n+m+2)*sizeof(char));
/*
*/
return tab1;
}
int main(){
char tab[4][6]={ {'g','h','t','e','g','d'},
{'j','h','y','t','r','e'},
{'g','h','j','y','r','t'},
{'y','d','s','q','w','e'} };
fun(tab,6,4); //here got"passing argument 1 from incompatible pointer type
return 0;
}
答案 0 :(得分:3)
数组标签定义为
char tab[4][6]
在表达式中用作函数的参数时,会转换为指向其第一个元素的指针。那就是它的类型
char ( * )[6]
您正尝试将其分配给声明为
的参数char **
没有从char ( * )[6]
类型到类型char **
的隐式转换,而且此类转换无效。
您可以将函数声明为具有参数作为指向可变长度数组的指针(假设编译器支持VLA)。例如
char* fun(int n, int m, char tab[][n] );
或者您可以在不使用VLA的情况下声明该功能。例如
char* fun( int m, char tab[][6] );
考虑到通常首先将行数作为参数传递,然后传递列数。在函数声明中,您首先会传递列数6
。
这是一个演示程序,显示如何将VLA声明为函数参数。
#include <stdio.h>
void f( size_t n, size_t m, char tab[][m] )
{
for ( size_t i = 0; i <n; i++ ) printf( "%s", tab[i] );
printf( "\n" );
}
#define N 3
#define M 11
int main(void)
{
char tab[N][M] =
{
"new",
"bie",
"programmer",
};
f( N, M, tab );
return 0;
}
输出
newbieprogrammer