3

当我尝试执行以下操作时,我收到一条错误消息,提示我正在尝试读取或写入受保护的内存。

void func1(int * ptr) {
    int *ptr_b = new int[5];
    ptr = ptr_b; 
}

void main() {
    int *ptr_a;
    func1(ptr_a);
    delete [] ptr_a;
}

这合法吗?

4

3 回答 3

9

不,你犯了一个常见的初学者错误。您不记得指针只是按值传递的变量,除非您要求引用或指向它们。将函数的签名更改为void func1(int *& ptr)

于 2012-05-07T16:29:19.340 回答
7

将您的签名更改为:

void func1(int *& ptr)

您按值传递指针,因此外部ptr不会改变。所以这就像做

int main() {  // <--- main returns int
    int *ptr_a;
    delete [] ptr_a;
}

这是非法的,因为ptr_a没有初始化。

于 2012-05-07T16:29:06.050 回答
4

您按值传递了指针。这意味着该函数使用的指针是调用者指针的本地副本。因此调用者看不到您在函数中分配的值。

而是通过引用传递它,以便函数可以分配给调用者的指针,而不是分配给本地副本。

void func1(int* &ptr)

或者,也许考虑返回新分配的指针:

int* func1()
{
    return new int[5];
}

我更喜欢后一种方法。

于 2012-05-07T16:29:58.223 回答