当我尝试执行以下操作时,我收到一条错误消息,提示我正在尝试读取或写入受保护的内存。
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];
}
我更喜欢后一种方法。