无法理解指针机制

Unable to understand the pointer mechanism

本文关键字:指针 机制      更新时间:2023-10-16

为什么下面的程序崩溃了?我尝试调试代码,但无法理解;我怀疑程序是错误的,或者传递给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;
}

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

#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;
}

每当你分配内存时,你需要记住自己释放它(删除单个变量,delete[]为数组(。

*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 循环来改进这一点。