【问题标题】:Passing array of Arrays to a function将数组数组传递给函数
【发布时间】:2019-06-21 08:20:22
【问题描述】:

我试图将数组数组传递给函数,但没有得到正确的结果。为此,我查看了 [this SO post][1]。我没有收到任何警告,我正在使用 TDM GCC 64 编译器。这段代码有什么问题?

#include <stdio.h>
#include<inttypes.h>

void printArrayOfArrays(uint8_t numRows,uint8_t numColumns,int arraOfArray[][numColumns]);


int main(void)
{
    int numRows, numColumns, rowCount, colCount, first[5][5];

    printf("Enter the number of rows and columns of matrix\n");
    scanf("%d%d", &numRows, &numColumns);

    printf("Enter the elements of first matrix\n");

    for (rowCount = 0; rowCount < numRows; rowCount++)
    {
        for (colCount = 0; colCount < numColumns; colCount++)
        {
            scanf("%d", &first[rowCount][colCount]);
        }
    }

    for (rowCount = 0; rowCount < numRows; rowCount++)
    {
        for (colCount = 0 ; colCount < numColumns; colCount++)
        {
            printf("%d\t",first[rowCount][colCount]);
        }
        printf("\n\n");
    }

    printf("\n");

    printArrayOfArrays(numRows,numColumns,first);

    return(0);
}

void printArrayOfArrays(uint8_t numRows,uint8_t numColumns,int arrayOfArray[numRows][numColumns])
{
    for (uint8_t rowCount = 0; rowCount < numRows; rowCount++)
    {
        for (uint8_t colCount = 0 ; colCount < numColumns; colCount++)
        {
            printf("%d\t", *(*(arrayOfArray+rowCount)+colCount));
        }
        printf("\n");
    }
}

我得到的结果是

Enter the number of rows and columns of matrix
2
2
Enter the elements of first matrix
4
3
1
6
4       3

1       6

4       3
0       0

【问题讨论】:

  • 为什么在函数调用中使用指针运算?恕我直言,在同一结构上混合使用数组访问语法和指针算法并不是一个好习惯。
  • 我同意,我只是一个学习者,我正在用各种方法来观察行为。

标签: c arrayofarrays


【解决方案1】:

main 中的firstprintArrayOfArrays 中的arrayOfArrays 的数组定义不一致:first 是一个 5×5 数组,即使您不使用或初始化所有元素; arrayOfArrays 是一个可变长度数组,在您的示例中为 2×2。

因此,您也应该将first 设为可变长度数组:

printf("Enter the number of rows and columns of matrix\n");
scanf("%d%d", &numRows, &numColumns);

int first[numRows][numColumns];

(确保仅在 numRowsnumColumns 具有有意义的值之后定义它。)

或者您可以将函数的参数设为 5×5 的固定大小数组:

void printArrayOfArrays(uint8_t numRows, uint8_t numColumns,
    int arrayOfArray[5][5]);

(在这种情况下,您必须确保numRowsnumColumns 不超过5。)

【讨论】:

  • 用这个打败我,但他们还需要修复printArrayOfArrays中的打印语句...应该只是printf("%d\t", arrayOfArray[rowCount][colCount]);
  • @idz:*(*(a + row) + col) 语法没问题,但很复杂。 (为了可读性,它仍然应该更改。)
  • 是的,也许“需要”有点太强烈了……“应该”或“应该”会更好。我的错!
  • 为什么编译器没有警告?我们如何在 C 中编写无错误代码?这不是编译器问题吗?我是 C 的初学者,我认为我不会注意到这些危险的问题。因此,当我们将数组数组传递给函数时,我们可能无法概括该函数,而函数可能应该通过在函数内部静态定义固定长度数组来满足最大可能的参数?另一方面,我可能有一个 nxm 维度的数组,但我可能不会使用所有的行和列。我可以使用同一个数组来存储不同数量的行数和列数。
【解决方案2】:

您是否尝试使用其他语法访问这些值,例如:

 printf("%d\t", arrayOfArray[numRow][numColumn]));

这对我来说是显而易见的方式,但也许我没有理解这个问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多