无法理解指针机制

时间:2014-12-11 02:56:02

标签: c++ arrays pointers

为什么下面的程序会崩溃?我尝试调试代码但无法理解;我怀疑程序是错误的还是已经初始化了传递给display函数的指针的内存。

#include <iostream>
using namespace std;

int display( int** intarray )
{
    int size = 0;
    while( size < 10 )
    {
        *intarray[size] = size;
        size++;
    }

    return size;
}

int main() {
    int* intptrarray;
    int arraysize = 0;
    arraysize = display( &intptrarray );

    for ( int indx = 0; indx < arraysize; indx++ )
    {
        std::cout << intptrarray[indx] << std::endl;
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

声明指针时,它不指向任何特定的内存地址。要让它指向某个地方,您需要按如下方式为其分配内存:

#include <iostream>
using namespace std;

int display( int** intarray, int arraysize )
{
    int size = 0;
    while( size < arraysize )
    {
        (*intarray)[size] = size;
        size++;
    }

    return size;
}

int main() {
    int arraysize = 10;
    int* intptrarray = new int[arraysize];

    arraysize = display( &intptrarray, arraysize );

    for ( int indx = 0; indx < arraysize; indx++ )
    {
        std::cout << intptrarray[indx] << std::endl;
    }

    delete[] intptrarray;
    return 0;
}

每当你分配内存时,你需要记住自己解除分配(删除单个变量,删除数组的[])。

答案 1 :(得分:0)

*intarray[size]应为(*intarray)[size]

但是你还没有分配任何内存,所以在这两种情况下你都会通过写一个未初始化的指针来引起未定义的行为。

编写此程序的正确方法是:

void display( std::vector<int> &vec )
{
    vec.resize(10);
    for ( int i = 0; i < 10; ++i )
        vec[i] = i;
}

int main()
{
    std::vector<int> vec;
    display(vec);

    for ( int indx = 0; indx < vec.size(); indx++ )
    {
        std::cout << vec[indx] << std::endl;
    }
}

如果你有一个现代的编译器,这可以通过使用std::iota和基于范围的for循环来改进。