C++ 指针错误-“使用未初始化值”,即使我认为它已初始化?

C++ 指针错误-“使用未初始化值”,即使我认为它已初始化?,c++,pointers,C++,Pointers,我说的是这段代码: #include <iostream> using namespace std; void citire(int& n, int* a) { cin >> n; a = new int[100]; for (int i = 0; i < n; i++) { cin >> a[i]; } } int main() { int n, *a; citire

我说的是这段代码:

#include <iostream>

using namespace std;

void citire(int& n, int* a)
{
    cin >> n;
    a = new int[100];
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
}

int main()
{
    int n, *a;
    citire(n, a);
    for (int i = 0; i < n; i++)
    {
        cout << *a << " ";
    }
    return 0;
}
我不需要通过引用传递它-创建一个浅拷贝


为什么默认情况下数组会发生这种情况,而指针却不会?虽然现在我的程序崩溃的原因已经很清楚了。

我认为您应该进一步了解如何在C函数中传递参数

首先,虽然a是一个指针,但它的内存分配发生在citire中,在citire中,a被分配了新的内存地址。 但a在citire中作为价值传递。 当程序返回到main时,您仍然具有先前的值a

其次,如果将未初始化的指针传递给函数,编译器将警告您,因为它假定您将使用该指针,例如*a=8,并且由于该指针未初始化,可能导致崩溃

您最好更改您的功能原型:

int * cintire(int& n);
void cintire(int& n, int *& a);

Z.

我认为您应该进一步了解如何在C函数中传递参数

首先,虽然a是一个指针,但它的内存分配发生在citire中,在citire中,a被分配了新的内存地址。 但a在citire中作为价值传递。 当程序返回到main时,您仍然具有先前的值a

其次,如果将未初始化的指针传递给函数,编译器将警告您,因为它假定您将使用该指针,例如*a=8,并且由于该指针未初始化,可能导致崩溃

您最好更改您的功能原型:

int * cintire(int& n);
void cintire(int& n, int *& a);

Z.

我修复了您的代码,还打印了一些地址供您理解

旧代码: 包括 使用名称空间std; void citireint&n,int*a { cin>>n; a=新整数[100]; 对于int i=0;i>a[i]; }
我修复了你的代码,还打印了一些地址供你理解

旧代码: 包括 使用名称空间std; void citireint&n,int*a { cin>>n; a=新整数[100]; 对于int i=0;i>a[i]; }
cout citire::a是main::a的副本,因为它是按值传递的。您希望像n一样通过引用传递它。旁注:您正在泄漏内存-使用std::vector而不是裸新的。您将按值传递给函数,因此函数中的赋值将只分配给局部变量。main函数中的a变量将“不能修改。void citireint&n,int*a->void citireint&n,int*&a。它变得不可读了,不是吗?改用std::vector!关闭投票者:这个问题不是由输入错误引起的,而是由于对传递指针的工作原理的误解。没有理由关闭这个问题。我也不明白为什么它应该被否决;th这是a,很清楚。请提出一个新问题,而不是编辑以提出一个新问题。这对回答者不公平。citire::a是main::a的副本,因为它是按值传递的。您希望像n一样按引用传递它。旁注:您正在泄漏内存-使用std::vector而不是裸新的。您将按值传递给函数,因此函数中的赋值将只赋值给局部变量。主函数中的a变量不会被修改。void citireint&n,int*a->void citireint&n,int*&a。它变得不可读了,不是吗?请改用std::vector!Close voter:问题不是由键入错误引起的,而是由于对如何传递的误解一个指针是有效的。没有理由关闭这个问题。我也不明白为什么它应该被否决;有一个,而且很清楚。请提出一个新问题,而不是编辑来提出一个新问题。这对回答者不公平。明白了。我希望它仍然有效,因为如果不使用指针,我会使用简单的数组而不是指针我不需要通过引用来传递它。首先,我明白数组不是指针,指针也不是数组。请检查以下答案:。明白了。我希望它能正常工作,因为如果不使用指针,我会使用简单的数组,而不是指针,我就不需要通过引用来传递它。首先,我要理解arraY不是指针,指针也不是数组。请检查以下答案:。
Address of a = 0x7ffee5ab6b90
Address of n = 0x7ffee5ab6b98
5
1 2 3 4 5
In citire Address of a = 0x7ffee5ab6b50
In citire Address of n = 0x7ffee5ab6b98
0 0 0 0 0
Address of a = 0x7ffee0eb1b90
Address of n = 0x7ffee0eb1b98
5
1 2 3 4 5
In citire Address of a = 0x7ffee0eb1b90
In citire Address of n = 0x7ffee0eb1b98
1 2 3 4 5
Address of a = 0x7ffeef1cda00
Address of n = 0x7ffeef1cd9f8
Address of first element of a = 0x7ffeef1cda00
5
1 2 3 4 5
In citire Address of a = 0x7ffeef1cd9b0
In citire Address of n = 0x7ffeef1cd9f8
In citire Address of first element of a = 0x7ffeef1cda00
1 2 3 4 5