【问题标题】:Integer array pointer implementation in C++C ++中的整数数组指针实现
【发布时间】:2015-05-21 23:55:11
【问题描述】:
int a[5]={1,2,3,5,6};
int *apnt= a;
while (*apnt)
{
 printf("The no is %d\n",*apnt);
 apnt++;
}

与字符串不同,我知道数组末尾没有空元素。但是,无论我刷新内存多少次或重新启动 xcode,我的代码总是给出以下输出。这里发生了什么?有人可以给我一个见解吗?

输出是:

The no is 1
The no is 2
The no is 3
The no is 5
The no is 6
The no is 32767
The no is 144723190
The no is 1694538263
The no is 1606416704
The no is 32767
The no is -1982110263
The no is 32767

【问题讨论】:

  • 你有未定义的行为。所以呢?
  • 如果您知道最后没有添加 null,您为什么期望 while (*apnt) 为您做任何有用的事情?
  • 您已经描述了您观察到的情况,但没有描述这与您的预期有何不同。由于输出没有任何“错误”,我们需要知道您的期望,以便纠正您的任何误解。
  • 我希望你意识到通过使用 while (*apnt) 你指向数组的第一个元素,即 1;这具有使while循环成为无限循环的效果。尝试删除尊重运算符。
  • @bames53:他说“我的代码总是给出以下输出,无论我刷新内存多少次,或者重新启动 xcode”。换句话说,他预计“错误”输出(在 1 2 3 5 6 之后)每次都会改变,因为这些内存地址的内容应该是随机的。相反,它总是一样的。为什么?

标签: c++ arrays pointers


【解决方案1】:

读到数组末尾是undefined behavior。您所看到的,即使您看到任何东西,也无法通过 C++ 语言规则来预测。

你得到这个输出是偶然的,它可能在每台机器上都不同,即使每次运行。 Here 它做了一些别的事情,但它确实可以做到任何事情

【讨论】:

    【解决方案2】:

    我认为其他回答者误解了您的问题的意图 - 我假设您不是试图在 C++ 中找到未定义的行为,只是想遍历您的数组。您的代码中的问题是,您不断将指针 apnt 递增到数组末尾。这是未定义的行为,任何事情都可能发生。

    但是,在这种情况下,通常会发生什么,您将继续读取 a 数组(函数中的其他局部变量)之后的内存。这就解释了为什么“乱码”输出是可以预测的。相反,您应该只迭代数组中的元素数量(例如,使用 for 循环),或者您可以在数组末尾添加一个“0”,这样 while 循环将终止。

    【讨论】:

    • 是的,我知道出了什么问题。我的意图不是循环到数组的末尾(我确实知道该怎么做),而是要了解为什么我会得到某种行为。谢谢您的帮助!现在我看到这是一个未定义的行为!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多