【问题标题】:Can't modify a 2D array of an unknown size within a fucntion in C无法在 C 中的函数中修改未知大小的二维数组
【发布时间】:2018-03-10 19:39:36
【问题描述】:

我是 C 新手,我只是不知道如何在函数中修改二维数组。 这是我尝试过的代码:

void init_matrix(int **M) {
    M[0][0] = 1;
}

int main(void) {    
    int M[3][3];    
    init_matrix(M, 3);

    return 0;
}

(请注意,为了专注于这个问题,此代码是自愿删除的,我需要我的函数能够处理全局未知大小的数组(尽管它可能是函数的参数))

当我尝试运行它时,它只是卡住了......调试器说这是在这个内存槽中写入的权利问题。

您将如何以 C 精神编写 init_matrix 函数? 为什么我的矩阵不能写?

我希望尽可能少使用“高级”概念和功能。

提前致谢 =)

【问题讨论】:

  • 你必须列出你的编译器。 void init_matrix(int **M)init_matrix(M, 3); -- 这张照片有什么问题? “寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题是没有用的给其他读者。见:How to create a Minimal, Complete, and Verifiable example。”

标签: c function multidimensional-array parameter-passing


【解决方案1】:

数组不是指针。当您将数组作为函数参数传递时,您需要给出数组的维度。

void    init_matrix(size_t x, size_t y, int matrix[x][y])
{
    for (size_t i = 0 ; i < x ; ++i)
    {
        for (size_t j = 0 ; j < y ; ++j)
            matrix[i][j] = 1;
    }
}

int     main(void)
{
    int matrix[5][3];

    init_matrix(5, 3, matrix);

    return (0);
}

函数init_matrix() 将维度作为参数,然后是数组(此顺序在这里很重要)。 “双循环”是通过像我们的数组这样的“2D 内存区域”运行的经典方法。 (请注意,您可以忘记第一个维度,

void init_matrix(size_t x, size_t y, int matrix[][y])

也有效)

【讨论】:

    猜你喜欢
    • 2013-04-12
    • 1970-01-01
    • 2011-07-13
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多