C ++使用指向遍历数组的指针

时间:2015-11-21 01:29:02

标签: c++ arrays pointers

首先,我有一个初始化数组的函数,并返回指向其第一个元素的指针。

int* getPtrToArray()
{
    int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    return array;
}

这个函数只是创建一个不会被使用的数组。

void testing()
{
    int junk[3] = {1234, 5678, 9101112};
}

这是我的主要功能:

int main()
{
    // #1
    int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int* ptr0 = array;

    cout << *ptr0 << endl;
    cout << ptr0[0] << endl;

    // #2
    int* ptr1 = getPtrToArray();

    cout << *ptr1 << endl;
    cout << ptr1[0] << endl;

    // #3
    testing();

    cout << *ptr1 << endl;
    cout << ptr1[0] << endl
}

输出结果为:

1
1
1
2066418736  // "ptr1[0]" should be the same as "*ptr1", right?
2066418736  // since testing() does not modify the array, why "*ptr1" is changed?
2066418736

我认为所有这六个输出都应该是1(数组中的第一个元素)。谁有人向我解释这个?谢谢!

3 个答案:

答案 0 :(得分:1)

请不要将指针返回到局部变量或数组。程序用完范围后,将回收局部变量的内存,从而导致未定义的行为。

答案 1 :(得分:1)

数组是本地的。当函数调用返回时,释放内存。 ptr1引用了未定义的区域。

int* getPtrToArray()
{
    int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    return array;
}

答案 2 :(得分:1)

我似乎记得这样的工作,但它是一个滥用C的东西而不是C ++的东西。

如果我没记错的话,堆栈不会费心擦除旧数据,只是说它是免费的,然后下次初始化新数据时数据可能会或可能不会被破坏,具体取决于您在退出范围之前初始化的数量和退出范围后,编译方式和功能使用情况。堆栈指针只是向后移动以回收内存,并且不打扰擦除内存,因为这需要额外的工作。

你可以从中得到奇怪的优化,但如果你是用C ++编程,你不应该使用C数组,而应该使用向量或其他C ++容器。另一方面,如果您使用C语言或汇编语言进行编程,则可能会利用此类行为。