gpt4 book ai didi

C 矩阵维度与声明不同

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:51 27 4
gpt4 key购买 nike

如果之前有人问过这个问题,我提前道歉——我找不到。

这只是一个奇怪的错误,我不明白它几乎没有(如果有的话)实用性。这是代码:

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

void print_matrix(int a[4][3], int i, int j)
{
printf("a[%d][%d] = %d\n", i, j, a[i][j]);
return;
}

int main(void)
{
int i, j;
int array[3][5];
for (i = 0; i < 3; i++)
{
for(j = 0; j < 5; j++)
{
scanf("%d",&(array[i][j]));
}
}
printf("array[2][1] = %d\n", array[2][1]);
print_matrix(array, 2, 1);
printf("array[0][4] = %d\n", array[0][4]);
print_matrix(array, 0, 4);
return 0;
}

我声明了一个大小为 [3][5] 的矩阵,但是当我在另一个函数中使用此矩阵并以大小 [4][3] 调用它时,它会返回奇怪的结果。有人可以解释一下在这种情况下访问内存的方式吗?

最佳答案

您的代码具有未定义的行为,因此任何事情都有可能发生。该函数的第一个参数应该是 int (*a)[3],一个指向 3 个整数数组的指针。作为函数参数的数组总是衰减为指针,在本例中是指向数组的指针。但是,当您传递 array 时,它会衰减为 int(*)[5],一个指向包含 5 个整数的数组的指针。

根据 C11 标准的以下子部分:

[§6.7.6.1 ¶2]

For two pointer types to be compatible, both shall be identically qualified and both shall be pointers to compatible types.

[§6.7.6.2 ¶6]

For two array types to be compatible, both shall have compatible element types, and if both size specifiers are present, and are integer constant expressions, then both size specifiers shall have the same constant value. If the two array types are used in a context which requires them to be compatible, it is undefined behavior if the two size specifiers evaluate to unequal values.

由于指针类型不兼容,编译器可以不受限制地发出它想要的任何代码。代码甚至不必有意义,这就是未定义行为的含义。

但是 GCC(当然还有其他编译器)可以针对代码发出以下警告:

warning: passing argument 1 of 'print_matrix' from incompatible pointer type [-Wincompatible-pointer-types]

所以总是在启用警告的情况下进行编译,并注意它们!


至于最有可能发生的情况,您需要考虑如何对多维数组进行数组访问。大小 3 是数组定义的一部分,因此当您编写 a[i][j] 时,它将被解释为:

*(a + i * 3 + j)

但这不是数组的正确算法,正确的访问等同于

*(array + i * 5 + j)

所以本质上,通过 a 读取 array,您访问了错误的单元格。

关于C 矩阵维度与声明不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43317556/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com