从不兼容的指针类型到2d数组的赋值

时间:2014-12-18 18:46:51

标签: c

我不确定为什么会这样,我想我正在做的一切正确。也许有人可以帮助我指出正确的方向。

在代码结束时,我得到了“从不兼容的指针类型传递参数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;
}

1 个答案:

答案 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