【问题标题】:C Program crashes when assigning values to a matrix using a function使用函数为矩阵赋值时C程序崩溃
【发布时间】:2018-06-07 03:19:09
【问题描述】:

我试图创建一个二维矩阵,其大小由用户选择(即 dims[] 值是通过 scanf 分配的),然后对其进行初始化。

当我尝试使用函数将值分配给 char 矩阵时,我的程序编译但崩溃了。
我想这与列数(第二个括号)以及我使用数组来定义矩阵二维大小的事实有关。该问题仅在分配值时出现(而不是在打印时)。

int main()
{
    int dims[2] = {3,4}; 
//^The exact values are besides the point, chose some at random 
    char board[dims[0]][dims[1]];
    initialize_board(board, dims);
}

函数如下所示(MAX_SIZE #定义为 25):

void initialize_board(char board[][MAX_SIZE], int board_side[])
{
    for(int i=0; i<board_side[0]; i++)
    {
        for(int j=0; j<board_side[1]; j++)
        {
            board[i][j]='-';
        }
    }
}

函数声明如下:

void initialize_board(char board[][MAX_SIZE], int board_side[]);

我应该怎么做才能解决这个问题?

【问题讨论】:

  • 崩溃发生在哪里?在线board[i][j]='-';吗?
  • 是的,它发生在board[i][j]='-'; 编译器是 GNU GCC..?这就是它在代码块中所说的,不确定是否应该说更具体的内容
  • 您选择通过在第一个问题(为什么会崩溃?)中添加第二个问题(我应该如何设计我的代码?)来使这个问题成为一个移动目标。另一种方法是提出一个新的单独问题。祝你好运。
  • 编译所有警告和调试信息:gcc -Wall -Wextra -gGCC。改进您的代码以获得没有警告。 使用调试器gdb。另见this
  • [MAX_SIZE] 在这种情况下并不意味着“任何大小”或“任何大小到 MAX_SIZE”或类似的东西。它的意思是“正好是 MAX_SIZE”。 4 不完全是 MAX_SIZE。

标签: c arrays function matrix multidimensional-array


【解决方案1】:

您的电路板尺寸为 3*4。
您的函数在 start 后面的 25 个条目的倍数处访问那个小板(对于内部循环中的 j>0),即在条目号 3*4 后面有 13 个条目,即在索引 11 的最后一个有效条目后面有 14 个条目。

【讨论】:

  • 哦,我明白了,虽然我不知道为什么......无论如何我应该如何以不同的方式编写我的代码来解决这个问题?
  • 对于这个新问题的答案(请将其设为一个,而不是在此问题中添加更多问题),您应该提供有关范围和上下文的更多信息。 IE。你想达到什么目的。尽量不要让这个问题成为 XY 问题的一个实例。您尝试实现的任何目标都有可能需要重新设计您的 API。使用指向 int 的简单指针和大小结构作为参数是第一个猜测。您在 C 中使用指针方面很有经验,不是吗。如果不是ericlippert.com/2014/03/21/find-a-simpler-problem
  • 对不起,我是新手...我尝试制作一个矩阵,其值由用户分配(最初 dims[] 值是通过 scanf 分配的),然后对其进行初始化。我对指针一点经验都没有。反正谢谢...
  • @XcoderX 询问完整代码通常会导致“我不能,因为它太长,或者是秘密,或者......”。您可能想建议改为使用minimal reproducible example
  • 好的,注意@Yunnosch!!
【解决方案2】:

以下是如何将可变长度数组 (VLA) 正确传递给函数。

void initialize_board(int m, int n, char board[m][n]) { ... }

int main ()
{
   int m, n;
   ... // initialize m and n here
   char board[m][n];
   initialize_board(m, n, board);
}

VLA 在声明为自动变量时可能很危险,因为当大小变得有点过大(几 KB 或 MB,取决于您的操作系统和硬件)时,它们很容易使您的程序崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多