当我尝试做以下我得到一个错误说我试图读取或写入受保护的内存。
void func1(int * ptr) {
int *ptr_b = new int[5];
ptr = ptr_b;
}
void main() {
int *ptr_a;
func1(ptr_a);
delete [] ptr_a;
}
这是合法的吗?
当我尝试做以下我得到一个错误说我试图读取或写入受保护的内存。
void func1(int * ptr) {
int *ptr_b = new int[5];
ptr = ptr_b;
}
void main() {
int *ptr_a;
func1(ptr_a);
delete [] ptr_a;
}
这是合法的吗?
不,你正在犯一个共同的错误初学者。 你没有记住,指针只是由价值,除非你要求一个引用或指针传递这些变量。 更改签名的函数来void func1(int *& ptr)
更改您的签名:
void func1(int *& ptr)
你是按值传递的指针,所以外界ptr
不会得到改变。 因此,这就像做
int main() { // <--- main returns int
int *ptr_a;
delete [] ptr_a;
}
这是非法的,因为ptr_a
未初始化。
您按值传递的指针。 这意味着该功能的工作原理与指针调用者的指针的本地副本。 所以你在函数赋值不能被调用者看到。
按引用传递它,而不是让该功能可以分配给调用者的指针,而不是分配给一个本地副本。
void func1(int* &ptr)
或者,也许考虑返回新分配的指针:
int* func1()
{
return new int[5];
}
我更喜欢后者的做法。