【问题标题】:Can I access multidimensional array using a pointer?我可以使用指针访问多维数组吗?
【发布时间】:2012-01-15 17:58:13
【问题描述】:

来自this 参考,在 C 中,以下行为似乎是未定义的。

int my_array[100][50];
int *p = my_array[0];
p[50]; // UB

在 C++03 或 C++11 中是否有证实这一点的参考资料?

【问题讨论】:

  • 您为什么认为p[50] 涉及未定义的行为?
  • 有趣的是,我可以使用gcc -Wall -Wextra 编译您的示例,并且不会收到有关任何未定义行为的警告;将p[50] 更改为p[50] = 1; 以消除“无效”警告并确保它知道它应该生成代码。 (如果您想确保它不会优化线路,请添加一些 printf(3) 调用。)
  • @Let_Me_Be:阅读链接。似乎在问两个不同的事情,需要澄清他是想知道二维数组指针(根据链接)还是静态数组(根据他的代码)。
  • @让它不在 int[50] 数组的元素中。
  • 它是一个自己的实体。子对象是对象,对象是实体类型(在 C++ 中)。我不知道 C 上下文中的“实体”概念。

标签: c++ arrays pointers multidimensional-array


【解决方案1】:

在 + 运算符的描述中是的。您可能不会在 C 中取消引用该指针,因为它是第一个子数组的结束指针。在 C++ 中,这目前是合法的,因为指针 points 指向一个有效的整数(指向关系的点在第 3 节的某处定义)。然而,在这两个标准中添加超过 50 个会产生未定义的行为。

最近向 c++ 委员会发送了一份 DR,内容是关于取消引用此类“凭空有效”的指针可能会被取消引用的规则,所以我不会依赖它。

【讨论】:

  • 妈的,我这里没有C89标准,但是C99讲的指针指向一个数组在多维数组的情况下,我个人会这么解释定义行为,因为指针不指向原始数组之外,只指向子数组之外。
  • 澄清一下,当您说“是”时,您的意思是“是的,行为未定义”; (问题标题是实际帖子中问题的否定!)。说你不能添加超过 50 个的标准部分是 [expr.add]#5
【解决方案2】:
int my_array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
for(i=0;i<3*3;i++)
{
    printf("%d,",*(*my_array+i));
}

输出是 1,2,3,4,5,6,7,8,9,

我认为你可以这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多