c++可以传递空指针给函数吗?



例如,我想声明指向数组的指针而不想初始化它。然后,我想把它传递给一个函数并在函数中初始化它。我如何在c++中做到这一点?

void F(int *B, const int& N) {
B = new int[N];
for (int i = 0; i < N; ++i) B[i] = i;
}
int main() {
int N = 4;
int *B = nullptr; // doesn't work
F(*B, N);
for (int i = 0; i < N; ++i)
cout << B[i] << endl;
return 0;
}

它引起/产生错误对应的问题是B没有对point和的引用,因此他不能初始化数组。

错误:Process finished with exit code 11

传递的指针是原始指针的副本。当修改F中的B时,Bimain()保持不变。

您需要通过引用传递指针或将指针传递给指针:

void F(int*& B, const int& N) {
B = new int[N];
for (int i = 0; i < N; ++i) B[i] = i;
}
int main() {
int N = 4;
int *B = nullptr; // doesn't work
F(B, N); //no operator here, just pass the pointer by reference
for (int i = 0; i < N; ++i)
cout << B[i] << endl;
return 0;
}

void F(int** B, const int& N) {
*B = new int[N];
for (int i = 0; i < N; ++i) (*B)[i] = i;
}
int main() {
int N = 4;
int *B = nullptr; // doesn't work
F(&B, N); //need address-of operator
for (int i = 0; i < N; ++i)
cout << B[i] << endl;
return 0;
}

另外,由于您决定使用手动内存管理,您还负责释放通过new获得的内存。如果您使用std::vector作为容器而不是原始指针(或std::unique_ptr或其他容器),则不需要这样做。

for (int i = 0; i < N; ++i)
cout << B[i] << endl;
delete[] B; //release memory after use
return 0;

你至少有两个问题

使用*B的调用中的第一个in。*BB[0]相同,这意味着您试图将单个int元素传递给函数。但是由于B是空指针,解引用将导致未定义行为

正确的(为了符合所示的函数签名)应该是普通的B:

F(B, N);

第二个问题是,默认情况下,将参数传递给函数是通过完成的。这意味着B的值被复制到F函数内部的局部变量B中。

当你在函数中赋值给B时,你只改变了本地副本,main函数中的原始值不会被修改。

要解决这个问题,您需要通过引用: 传递B
void F(int*& B, const int N) { ... }

最新更新