gpt4 book ai didi

有人可以解释这种行为吗?

转载 作者:太空宇宙 更新时间:2023-11-04 00:35:27 25 4
gpt4 key购买 nike

我写了一个简单的代码来获取最大 M 行的矩阵,但我不明白为什么它会给我一个奇怪的输出:

对于 M=50 :

"the cell [1][0] is : 17273520" (I get random outputs every time)

对于 M=4 :

"the cell [1][0] is : 0" (always)

#define M 50
void printImage(int a[][M]){
printf("the cell [1][0] is : %d",a[1][0]);
}

int main(){
int a[3][4] = {0};
printImage(a);
}

谁能解释一下 M 到底是什么?怎么运行的 ?以及如何使该函数适用于少于 M 行的矩阵?

最佳答案

C 中的二维数组 a 是数组的数组。 a 的每个成员因此必须具有相同的大小。定义中的第二个尺寸参数就是那个尺寸。

您传递给 printImage 的是一个衰减为指针的二维数组。它指向 a 的第一个数组元素。

现在,由于真正的二维数组的多维指针运算 a[i][j]*(a + i * M + j) 我们看到M 是类型定义的一部分。

如果您指定要传递 a[][50] 但实际上传递 a[][4],则 a[1] 的索引][0]方式超出数组边界。

由于访问数组边界之外是未定义的行为,任何事情都可能发生,你会得到一些随机值。但是该程序可能会崩溃或格式化您的硬盘。

这也是为什么您应该始终以尽可能高的警告级别构建您的程序(甚至将大部分变成硬错误)。例如,GCC can protect you具有以下有用的诊断:

error: passing argument 1 of 'printImage' from incompatible pointer type [-Wincompatible-pointer-types]


如果需要二维数组的数组元素大小不一。您可以指定该函数接受 variable length array .首先传递数组维度的大小,然后传递具有这些维度的数组:

void printImage(size_t n, size_t m, int a[n][m])
{
// a is a VLA with dimensions specified by n and m
// pointer arithmetic will be *(a + i * m + j)
}

The above is valid C99 .

关于有人可以解释这种行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41534873/

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