Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在函数中使用二维数组:错误_C_Multidimensional Array - Fatal编程技术网

C 在函数中使用二维数组:错误

C 在函数中使用二维数组:错误,c,multidimensional-array,C,Multidimensional Array,我尝试在2D数组中设置值并使用函数打印它 #include <stdio.h> void SetArr(int (*arr)[], int n); void PrintfArr(int (*arr)[], int n); int main() { int arr[100][100]; for(int i=0; i<100; i++) for(int j=0; i<100; j++) arr[i][j]=0;

我尝试在2D数组中设置值并使用函数打印它

#include <stdio.h>

void SetArr(int (*arr)[], int n);
void PrintfArr(int (*arr)[], int n);

int main()
{ 
    int arr[100][100];

    for(int i=0; i<100; i++)
        for(int j=0; i<100; j++)
            arr[i][j]=0;         //initiallize Array

     int size;

    printf("input Size : "); scanf("%d", &size);

    SetArr(arr, size);
    PrintfArr(arr, size);

    return 0;
}

void SetArr(int (*arr)[], int n)
{
   int i, j;

    for(i=0; i<n; i++)
   {
       for(j=0; j<n; j++)
            arr[i][j]=i+j;    // Error! "Subscript of Pointer to imcomplete~
   }
}

void PrintArr(int (*arr)[], int n)
{
   int i, j;

   for(i=0; i<n; i++)
   {
       for(j=0; j<n; j++)
           printf("%d", arr[i][i]);  // Error! "Subscript of Pointer to imcomplete~
   }
   printf("\n");
}
但是我很难将数组发送到函数

#include <stdio.h>

void SetArr(int (*arr)[], int n);
void PrintfArr(int (*arr)[], int n);

int main()
{ 
    int arr[100][100];

    for(int i=0; i<100; i++)
        for(int j=0; i<100; j++)
            arr[i][j]=0;         //initiallize Array

     int size;

    printf("input Size : "); scanf("%d", &size);

    SetArr(arr, size);
    PrintfArr(arr, size);

    return 0;
}

void SetArr(int (*arr)[], int n)
{
   int i, j;

    for(i=0; i<n; i++)
   {
       for(j=0; j<n; j++)
            arr[i][j]=i+j;    // Error! "Subscript of Pointer to imcomplete~
   }
}

void PrintArr(int (*arr)[], int n)
{
   int i, j;

   for(i=0; i<n; i++)
   {
       for(j=0; j<n; j++)
           printf("%d", arr[i][i]);  // Error! "Subscript of Pointer to imcomplete~
   }
   printf("\n");
}
#包括
无效SetArr(内部(*arr)[],内部n);
无效打印文件(内部(*arr)[],内部编号);
int main()
{ 
国际航空公司[100][100];

对于(int i=0;i,在函数声明中,数组必须与其大小(长度)一起提及。这就是编译器在说“不完整类型”时的意思:它需要大小来理解如何访问其元素

为了使编译器可以使用大小,它应该首先在函数声明中:

void SetArr(int n, int (*arr)[n])
这里的
arr
在技术上是一个“指向
n
元素数组的指针”,但在C语言中,通常将指针视为数组,因此
arr
可以被视为“一个
n
元素数组”,这与二维数组相同

您可能希望提及阵列的两个维度:

void SetArr(int n, int arr[n][n])

这相当于第一个声明,但看起来更清晰。

声明如下函数

void SetArr( int ( *arr )[100], int n );
void PrintfArr( int ( *arr )[100], int n );
您不能声明您标记为最佳的答案中显示的函数

考虑下面的代码,我使用3代替100表示数组维度。 如果您将在函数PrintArr和main中打印数组,您将得到不同的结果

#include <stdio.h>

void SetArr( size_t n, int (*arr)[n] )
void PrintArr( size_t n, int (*arr)[n] )


int main(void) 
{
    int arr[3][3];

    size_t n = 2;

    SetArr( n, arr );
    PrintArr( n, arr );


    printf( "\n" );

    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) printf( "%2d", arr[i][j] );
        printf( "\n" );
    }

    return 0;
}

void SetArr( size_t n, int (*arr)[n] )
{
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) arr[i][j] = i * n + j;
    }
}

void PrintArr( size_t n, int (*arr)[n] )
{
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) printf( "%2d", arr[i][j] );
        printf( "\n" );
    }
}
正如您所看到的,第一个输出与第二个输出不一致。如果像我在文章开头指出的那样声明函数,您将得到正确的结果

#include <stdio.h>

void SetArr( int (*arr)[3], size_t n );
void PrintArr( int (*arr)[3], size_t n );


int main(void) 
{
    int arr[3][3];

    size_t n = 2;

    SetArr( arr, n );
    PrintArr( arr, n );


    printf( "\n" );

    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) printf( "%2d", arr[i][j] );
        printf( "\n" );
    }

    return 0;
}

void SetArr( int (*arr)[3], size_t n )
{
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) arr[i][j] = i * n + j;
    }
}

void PrintArr( int (*arr)[3], size_t n  )
{
    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ ) printf( "%2d", arr[i][j] );
        printf( "\n" );
    }
}

正如您在本例中所看到的,这两个输出是一致的。

如果没有其他任何输出:调用
printf(“%d”,arr[i][i]);
调用
PrintArr
应该修改为
printf(“%d”,arr[i][j]);
int(*arr)[]
没有指定指向的数组的大小…因此编译器无法知道函数中2D数组中的行有多大。如果使用
int(*arr)[100]
,它应该可以工作…虽然那时你的行大小固定在100
int
s@Dmitri哇谢谢…我觉得真的很愚蠢哈哈。我记得了谢谢!使用C99,你也可以执行
void SetArr(int n,int(*arr)[n])
@eureurung在我看来,您将一个不正确的答案标记为最佳答案,因为相对于您的代码,数组没有维度n*n。请参阅我的答案。例如,请在设置元素后尝试在main中打印它。
 0 1
 2 3

 0 1
 2 3