Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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_Matrix - Fatal编程技术网

C 如何正确使用带数组的函数

C 如何正确使用带数组的函数,c,matrix,C,Matrix,这是我写的一个小程序,用来添加2个方阵 当我输入第二个矩阵时,第一个矩阵的值被改变,结果随后为假。它对2x2矩阵非常有效,但对任何更大的矩阵都无效。 该算法在不使用函数的情况下运行良好。 请帮我解决这个问题 代码如下: #include <stdio.h> #include <stdlib.h> int n; void PrintMatrix(int P[n][n]) { int i,j; for(i=0;i<n;i++) {

这是我写的一个小程序,用来添加2个方阵

当我输入第二个矩阵时,第一个矩阵的值被改变,结果随后为假。它对2x2矩阵非常有效,但对任何更大的矩阵都无效。 该算法在不使用函数的情况下运行良好。 请帮我解决这个问题

代码如下:

#include <stdio.h>
#include <stdlib.h>

int n;
void PrintMatrix(int P[n][n])
{
    int i,j;
    for(i=0;i<n;i++)
    {
        printf("\n");
        for(j=0;j<n;j++)
        {
            printf("%d\t", P[i][j]);
        }
    }printf("\n");
}
void ReadMatrix(int P[n][n])
{
    int i,j;
    for(i=0;i<n;i++)
    {
    printf("input row %d\n", i+1);
        for(j=0;j<n;j++)
        {
        scanf("%d", &P[i][j]);
        }
    }
}
void AddMatrix(int P[n][n], int Q[n][n], int Result[n][n])
{
   int i,j;
    for(i=0;i<n;i++)
    {
    for(j=0;j<n;j++)
      {
        Result[i][j]=P[i][j]+Q[i][j];
      }
    }
}

int main()
{
    int i,j;
    int A[n][n];
    int B[n][n];
    int Sum[n][n];

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

    printf("input first matrix\n");
    ReadMatrix(A);
    PrintMatrix(A);

    printf("input second matrix\n");
    ReadMatrix(B);
    PrintMatrix(B);

    AddMatrix(A,B,Sum);
    PrintMatrix(Sum);
    return 0;
}
#包括
#包括
int n;
无效打印矩阵(int P[n][n])
{
int i,j;

对于(i=0;i,您可以使用结构定义自己的矩阵类型,例如:

typedef struct
{
  int*    data;
  size_t  width;
  size_t  height
} matrix_t;
或者,如果您有一个现代的C编译器,您可以编写如下函数

void func (size_t width, size_t height, int matrix[width][height])
但结构版本可能更受欢迎


编辑


至于你的程序有缺陷的原因,你必须将
n
初始化为一个值。如果你在从用户那里读取
n
后将数组声明为大小为[n][n]的可变长度数组,它应该可以正常工作。

如果你在gdb下运行这个程序,你会发现 (gdb)p A $14=0x7FFFFFDFB0 (gdb)p B $15=0x7FFFFFDFA0

无论选择什么“n”,数组基址总是相差16,即整数2 x 2矩阵工作

但是如果我输入长度为3,程序就会崩溃,内存崩溃。 输入前 (gdb)x/12 A 0x7FFFFFDFB0:0 0-255260739 52 0x7FFFFFFFC0:-1-1-1-1 0x7FFFFFD0:-8272 32767-1-1

输入后: x/12 0x7FFFFFFFB0 0x7FFFFFDFB0:1 2 3 4 0x7FFFFFFFC0:5 6 7 8 0x7FFFFFD0:932767-1-1 正如我给出的值1 2 3 4 5 6 7 8 9一样

但是 通讯社 $16=0x7fff00000009 这会导致PrintMatrix中的分段错误

现在如果你把你的程序改成这个

int main()
{
    int i,j;

    printf("input matrix size:");
    scanf("%d", &n);
    int A[n][n];
    int B[n][n];
    int Sum[n][n];

您的问题已经解决,您可以继续了

C需要在编译时知道矩阵的宽度,它不能是变量。@Barmar除了它不需要在编译时知道宽度之外,它可以是变量。VLA,欢迎来到1999年:)当然,也有很多情况下VLA不合适。@Lundin好的,但他需要在阅读
n
后声明矩阵变量,不是吗?@Barmar是的,数组声明必须在维度变量的右侧,请参见下面的答案。我知道VLA,但我认为它只适用于第一个维度打开。
int矩阵[宽度][高度]
-
宽度
高度
是否应为常数?现代C标准允许可变长度数组使用参数?@ikh它们不必为常数,现代C具有可变长度数组的概念。C99接受可变长度数组作为函数参数,只要长度参数在数组之前GNU C有一个允许参数转发的语法扩展,比如:
void func(size\t-width;size\t-height;int-matrix[width][height],size\t-width,size\t-height){…}
;在这种情况下,
宽度
高度
是形式参数,应该在
矩阵
之后传递,并且只是预先声明。它仍然不起作用。问题仍然是一样的。当我读取第二个矩阵的值时,第一个矩阵的值被更改。我不知道为什么会这样@Gladson啊,原来这只是一个小错误。请看我的最新答案。谢谢你的帮助。至少这是一个很好的错误解释。我得承认我不太懂。我还是一个初学者。:)