gpt4 book ai didi

我可以将多维数组视为一维数组吗?

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

我需要编写一个函数,它可以接受给定元素类型的任何二维数组。下面的 C 程序说明了我当前的方法。定义明确吗?

#include <stdio.h>

#define LEN(arr) (sizeof (arr) / sizeof (arr)[0])

static void Print(const int *A, int m, int n)
{
int i, j;

for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
printf("%d ", A[i * n + j]);
}
putchar('\n');
}
}

int main(void)
{
int A[2][3] = {{1, 2, 3}, {4, 5, 6}};

Print((int *) A, LEN(A), LEN(A[0]));
return 0;
}

最佳答案

您显示的代码的行为未由 C 标准定义,原因有二。第一,它违反了指针转换的规则。第二,它违反了有关指针运算的规则。

首先,考虑 (int *) A在调用 Print .在此代码中,数组 A自动转换为指向其第一个成员的指针,这是一个包含 3 int 的数组. C 2011 [N1570] 条款 6.3.2.3 第 7 段允许这种转换,其中指出“指向对象类型的指针可以转换为指向不同对象类型的指针。如果生成的指针未针对引用类型正确对齐,则行为未定义。否则,当再次转换回来时,结果应与原始指针相比较。”然而,这就是标准中关于转换指针的全部内容。当您在 Print 中使用指针时, 在表达式 A[i * n + j] 中,该行为未定义,因为 C 标准中没有任何内容告诉我们这个转换后的指针是什么,除了它可以转换回原始类型。尽管指针已转换为 int * , 我们不知道转换的结果实际上是指向 int 的可用指针那是 A[0][0] .

其次,即使这个指针是指向 A[0][0] 的有效指针, 标准没有定义当你使用它来索引超出 3 int 的数组时的行为是什么.在表达式 A[i * n + j] 中,下标表达式定义为等同于*((A) + (i * n + j)通过 6.5.2.1 2. 当 i * n + j添加到 A , 语义由 6.5.6 8 管理,它说只要结果指向同一数组中的另一个元素或指向最后一个元素之后的元素,就可以使用指针算术对指针进行加法或减法。如果你有指向第一个 int 的指针3 的数组 int然后添加足够的指针将指针移动到下一个数组 3 int ,您超出了限制,并且行为未定义。 (由于将 1 指向最后一个元素是合法的,您可以将 3 添加到指向 A[0][0] 的指针以获得指向超出 A[0][2] 的指针,但不允许将 * 应用于此指针,因为该段说“如果结果指向数组对象的最后一个元素之后的一个,则不应将其用作计算的一元 * 运算符的操作数。”)

也就是说,一些 C 实现将支持这些指针转换和这种算法。但是代码不可移植;它不严格符合 C 代码。

关于我可以将多维数组视为一维数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48491951/

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