从C ++中的指针访问数组元素

时间:2014-02-11 03:26:07

标签: c++ arrays pointers

我是c ++的新手,我已经阅读了很多有关此问题的堆栈溢出帖子。请告诉我我不理解的东西,看起来很基本......为什么呢?

int* getArray() {
    int a[] = { 3, 4, 3, 1, 5 };    
    return a;
}

void main() {
    int *result = getArray();
    for(int i = 0; i < 5; i++) {
        std::cout << result[i] << std::endl;
    }
}

返回:

3

263996040

-1

4651964

263540469

3 个答案:

答案 0 :(得分:1)

好的一个。您在函数中创建的数组在函数返回时停止存在。

您可以通过添加static关键字“保持”“

int* getArray() {
    static int a[] = { 3, 4, 3, 1, 5 };    
    return a;
}

void main() {
    int *result = getArray();
    for(int i = 0; i < 5; i++) {
        std::cout << result[i] << std::endl;
    }
}
函数返回后,

static使数组保留在内存中 - 通常是因为你想在函数中再次使用它。做上述事情被认为是“丑陋”,但它有效......

你所看到的是这样一个事实,即从getArray()返回后释放的内存很乐意被重新用于其他目的。事实上,没有告诉那里最终会发生什么(可能是cout函数的一些临时存储),当你将它解释为int时(因为你正在使用{{访问这些内存位置) 1}}指针),你只会看到int *a表示任何字节恰好在那里。

更新“不那么丑陋的方式”来做到这一点:

int

答案 1 :(得分:1)

a是一个临时变量,在函数getArray完成执行后将被解构。所以“结果”指向一些无效的记忆。

答案 2 :(得分:1)

不要使用“local”变量(堆栈分配的内存)并将其返回。而是使用动态(堆分配的内存)变量并将其返回并要求调用者在使用后销毁它。

喜欢这个......

void getArray(int** a, int &size)
{
    size = 5;
    // Allocate memory on heap so it remain accessible until destroyed explicitly.
    int *arr = new int[size];
    for (int i = 0; i<size; ++i)
    {
        arr[i] = i;
    }

    *a = arr;
    return;
}

int main() {
    int *a = NULL;
    int arrSize = 0;

    getArray(&a, arrSize);
    for(int i = 0; i < arrSize; i++) {
        std::cout << a[i] << std::endl;
    }

    // Release/Destroy the memory. DON'T FORGET TO CALL THIS ONCE YOU ARE DONE with 'a' !!
    delete a;

}