在函数中初始化的c++数组不能在main中访问

C++ array initialized in function cannot be accessed in main

本文关键字:不能 访问 main 数组 函数 初始化 c++      更新时间:2023-10-16

我有一个函数用于在c++中初始化数组。初始化后,main不能访问数组中的数据。不知道为什么。任何帮助吗?

void testArray(int *listPtr)
{
   listPtr=new int[2]; 
   listPtr[0]=0;
   listPtr[1]=1;

}// end testArray
void main()
{
   int *list;
   testArray(list);
   cout<<list[0]<<list[1]<<endl; // this gives some random output
} // end main

这是因为指针是按值传递的。函数的参数被复制,函数的第一行用new表达式的结果替换指针的本地副本。指针的原始副本,回到main(),不受此影响。

你可以通过引用传递指针来"修复"这个问题:

void testArray(int*& listPtr)
{
    listPtr = new int[2]; 
    // ...
}
int main()
{
    int* list = 0;
    testArray(list);
    // ...
    delete list;
    return 0;
}

或通过向指针传递一个指针:

void testArray(int** listPtr)
{
    *listPtr = new int[2];
    // ...
}
int main()
{
    int* list = 0;
    testArray(&list);
    // ...
    delete list;
    return 0;
}

或者,更好的是,使用提供值语义(与引用参数一起)的c++标准库容器:

void testVec(std::vector<int>& list)
{
    list.resize(2);
    list[0] = 0;
    list[1] = 1;
}
int main()
{
    std::vector<int> list;
    testVec(list);
    // ...
    return 0;
}

类比时间:

出现这个问题是因为指针是一个单独的实体(对象),指向另一个对象。指针可以像普通对象一样复制,并且不需要特别考虑它们,以确保它们所指向的对象被更新以反映对指针的任何更改。参考文献是完全不同的东西。一旦引用被绑定到某个对象上,它就(从所有意图和目的上)与对象本身无法区分;对引用的任何操作都是对底层对象的操作。你可以这样想:你有一只叫路威的猫,你让你的朋友借路威;但你朋友叫她巴菲。这是同一只猫,如果你的朋友修剪了她的爪子,下次你看到毛毛的时候,她就会修剪了爪子。

对于指针的例子,你有路威,你给你的朋友一张纸条,上面写着路威的地址。你的朋友去买了一只新猫,并把新猫的地址写在你给他们的纸条上。现在,当你的朋友修剪新猫的爪子时,毛毛什么也没发生。这张纸条只允许你的朋友去路威住的地方;直到你的朋友用另一只猫的地址覆盖了这张纸条。

引用可以更容易地推断代码的行为,并且在几乎所有情况下都应该首选

您需要通过引用传递,以便对指针listPtr本身的更改可以传递给外部变量。请记住,您正在更改"指针本身"的值,如果通过值传递,则调用者不可见。

void testArray(int * &listPtr)
{
   listPtr=new int[2]; 
   listPtr[0]=0;
   listPtr[1]=1;
}// end testArray

您需要使用引用传递,以便在testarray函数中初始化listPtr时更新它。

要做到这一点,请执行以下操作-

void testArray(int * &listPtr)
{
   listPtr=new int[2]; 
   listPtr[0]=0;
   listPtr[1]=1;
}

如果你对上面的解决方案感到困惑,你可以简单地声明并初始化这个全局