面试题答案
一键面试- 问题分析:
- 在
func
函数中,ptr
是main
函数中p
的一个拷贝。ptr = new int(5);
这行代码只是修改了ptr
指针本身,使其指向新分配的内存,但并没有改变main
函数中p
指针的值,所以main
函数中的p
仍然是nullptr
。当执行std::cout << *p << std::endl;
时,会导致空指针解引用,这是未定义行为。并且,由于p
仍然是nullptr
,delete p;
也是未定义行为。
- 在
- 修改方法:
- 可以通过传递指针的指针或者引用的方式来修改
main
函数中的指针。 - 方法一:传递指针的指针:
- 可以通过传递指针的指针或者引用的方式来修改
#include <iostream>
void func(int** ptr) {
*ptr = new int(5);
}
int main() {
int* p = nullptr;
func(&p);
std::cout << *p << std::endl;
delete p;
return 0;
}
- 方法二:传递引用:
#include <iostream>
void func(int*& ptr) {
ptr = new int(5);
}
int main() {
int* p = nullptr;
func(p);
std::cout << *p << std::endl;
delete p;
return 0;
}
在这两种修改后的代码中,都能正确地分配内存,输出指针指向的值,并在使用完毕后释放内存。