C++ 指针/for 循环混淆

标签 c++ arrays pointers for-loop stdio

我正在尝试编写一个程序,使用指针从 cin 读取值,然后将值与其在数组中的位置一起输出。我不明白为什么 printNumbers1 有效但 printNumbers2 无效。这是程序(底部附近的相关代码):

#include <iostream>

using namespace std;

int *readNumbers(int);
void printNumbers1(int*);
void printNumbers2(int*);

int main()
{
    int *numbers = readNumbers(5);
    printNumbers1(numbers);
    printNumbers2(numbers);
    return 0;
}

int *readNumbers(int n)
{
    int a[n];
    int *numbers;
    numbers = &a[0];
    for (int i=0; i<n; i++)
    {
        cin >> *(numbers+i);
    }

    return numbers;
}

void printNumbers1(int *numbers)
{
    cout << 0 << ' ' << *(numbers) << endl
         << 1 << ' ' << *(numbers+1) << endl
         << 2 << ' ' << *(numbers+2) << endl
         << 3 << ' ' << *(numbers+3) << endl
         << 4 << ' ' << *(numbers+4) << endl;
}

void printNumbers2(int *numbers)
{
    for (int i=0; i<5; i++)
    {
        cout << i << ' ' << *(numbers+i) << endl;
    }
}

当我运行该程序时,它按 printNumbers1 的预期工作,但为 printNumbers2 输出看似随机的数字和 0 的组合。我觉得两个 printNumbers 函数应该具有相同的功能,但事实并非如此。我错过了什么?

最佳答案

发生这种情况是由于两件事的结合:

  • C++ 不允许可变长度数组 - 这是一个流行的扩展,但声明 int a[n]不符合标准。
  • 不能从函数返回指向局部变量的指针 - 指针 numbers里面readNumbers指向a ,局部变量。你可以在函数内部使用这个指针,但是在函数外部它就无效了,因为a超出范围。

使用超出范围的变量会导致未定义的行为This Q&A很好地解释了正在发生的事情,以及为什么程序看起来运行良好。

如果要使用内置指针,请删除 int a[n] ,并更改 numbers 的声明如下:

int *numbers = new int[n];

您还需要添加

delete[] numbers;

之前return 0线以避免内存泄漏。

我假设您编写此代码是作为学习练习的一部分。不过,一般来说,C++ 中更好的方法是使用 std::vector<int> ,它对您的代码隐藏了指针操作,并为您处理资源管理。

关于C++ 指针/for 循环混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43166050/

相关文章:

ruby - 如何清理哈希和数组混合的数据?

php - while(list($key, $value) = each($array)) vs. foreach($array as $key => $value)?

c++ - 为什么释放无效指针在 C++ 中未定义?

c++ - LNK2019 使用 Qt 链接到外部库时出错

c++ - CMake第三方库 undefined reference

c++ - 在 Boost.Asio Stackful Coroutine 中产生

arrays - numpy 二维数组分区的优化方法

C++ vector 指向指针的指针

c++ - 指向指针 vector 的 vector

c++ - 我可以从对象外部调用 VFunc 吗?