c - 从不兼容的指针类型到二维数组的赋值

标签 c multidimensional-array implicit-conversion function-declaration

我不确定为什么会发生这种情况,我认为我做的一切都是正确的。也许有人可以帮助我指明正确的方向。

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

最佳答案

数组选项卡定义如下

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

关于c - 从不兼容的指针类型到二维数组的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27553590/

相关文章:

c++ - 从 C 程序调用 C++ 函数

php - in_array() 和多维数组

c++ - 为什么隐式转换在累积中不起作用?

scala - Scala中隐式参数的通用容器的隐式转换

c - 嵌套结构数组的 sizeof()

C 中具有负索引的数组的 Calloc

c - 将 n 字节整数拆分为单个字节的可移植方法

Swift 3d 数组创建

c - 将字符串输入二维数组

C++ 运算符重载参数与普通参数