【发布时间】:2021-02-21 06:08:24
【问题描述】:
我说的是这段代码:
#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;
}
我收到一条错误消息,提示 a 未初始化,我似乎无法理解原因。我在该函数中使用了a = new int[100],而a 是一个指针,所以我在哪里初始化它并不重要(只要我在使用它的值之前做)。
如果我在 int main() 中的函数调用 citire(n, a) 之前添加该行,则代码将起作用。
我可能认为产生错误的唯一原因是初始化发生在函数中。所以,如果我不打电话给citire(n, a),那么a 将是未初始化的。这是错误的原因吗?
或者为什么我会得到它?
编辑:
出现混淆是因为我知道数组基本上是指针,并且在将数组作为参数传递时,如下所示:
#include <iostream>
using namespace std;
void citire(int& n, int a[])
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
}
int main()
{
int n;
int a[100];
citire(n, a);
for (int i = 0; i < n; i++)
{
cout << *a << " ";
}
return 0;
}
我不需要通过引用传递它——创建了一个浅拷贝。
为什么默认情况下使用数组会发生这种情况,但不会使用指针? (虽然现在我的程序崩溃的原因很清楚了。)
【问题讨论】:
-
citire::a是main::a的副本,因为它是按值传递的。您希望通过引用传递它(就像您所做的n一样)。旁注:您正在泄漏内存 - 使用std::vector<int>而不是赤裸裸的new。 -
你将
a按值传递给函数,所以函数中的赋值只会赋值给局部变量。main函数中的a变量不会被修改。 -
void citire(int& n, int* a)->void citire(int& n, int*& a)。它变得难以阅读,不是吗?请改用std::vector! -
Close voter:问题不是由拼写错误引起的,而是对传递指针的工作原理的误解。没有理由结束这个问题。而且我也不明白为什么它应该被否决;有一个minimal reproducible example,很清楚。
-
请提出一个新问题,而不是编辑来提出一个新问题。这对回答者不公平。