接收指向2维数组结构的指针的C函数

时间:2017-06-23 22:53:01

标签: c function pointers struct declaration

我有这个结构

".headeritem"

在主代码中,我有一个".bodyitem"。我需要将此typedef struct _cood{ int x, y; }coordirnate; 作为指向函数coordinate foo[3][3]的指针传递。

foo

scanCood()函数是这样的:

void scanCood(coordinates *foo[3][3]);
void printCood(coordinates foo[3][3]);

int main(int argc, char** argv)
{
    coordinate foo[3][3];

    printf("WRITE YOUR NUMBERS:\n");
    scanCood(&foo);

    printf("PRINTING YOUR NUMBERS\n\n");
    printCood(foo);

    return (0);
}

使用scanCood打印非常简单,我没有遇到任何问题,但在输入2个数字后,程序核心转储在void scanCood(coordinate *foo[3][3]){ int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { scanf("%d", &foo[i][j]->x); scanf("%d", &foo[i][j]->y); } } } 上。

编译器提供了这些警告,但不会阻止编译:

Compilation output

我需要一些帮助,我应该如何用这个指针来实现这个功能。

1 个答案:

答案 0 :(得分:2)

函数声明错误。

我认为你的意思是以下

void scanCood( coordinate ( *foo )[3], size_t n )
{
    size_t i, j;
    for (i = 0; i < n; i++ ) 
    {
        for (j = 0; j < 3; j++) 
        {
            scanf("%d", &foo[i][j].x);
            scanf("%d", &foo[i][j].y);
        }
    }
}

该功能可以像

一样调用
scanCood( foo, 3 );

由参数声明

使用
coordinate * foo[3][3]

表示类型为coordinate *的二维指针数组,可调整为以下类型的指针

coordinate * ( *foo )[3]

如果要将指针传递给数组,则应将参数声明为

    coordinate ( * foo )[3][3]

虽然没有必要以这种方式声明参数。

在这种情况下,该函数确实被称为

scanCood(&foo);

但是应该使用正确的语法重写函数体。 例如

void scanCood( coordinate ( *foo )[3][3] )
{
    size_t i, j;
    for (i = 0; i < n; i++ ) 
    {
        for (j = 0; j < 3; j++) 
        {
            scanf("%d", &( *foo )[i][j].x);
            scanf("%d", &( *foo )[i][j].y);
        }
    }
}

考虑到函数声明中存在拼写错误

void scanCood(coordinates *foo[3][3]);
                        ^
void printCood(coordinates foo[3][3]);
                         ^