为什么不能在函数中设置指针

时间:2015-06-12 09:07:56

标签: c++ function pointers

我注意到如果我在函数中创建一个指针,它就不会让我为它设置一个值。 例如:

int func() {
    int* pointer;
    *pointer = 0    //error I get: "Exception: STATUS_ACCESS_VIOLATION"
    return *pointer;
}

我得到的不是让你在函数中设置指针,因为如果我使用普通的int它可以工作:

int func() {
    int notAPointer;
    notAPointer = 0;
    return notAPointer;
}

任何人都可以向我解释为什么会这样吗?

5 个答案:

答案 0 :(得分:4)

您尚未为指针指定任何内存指向。

这意味着取消引用指针(*pointer)会导致未定义的行为(就像你的情况下崩溃一样)。在解除引用之前,您需要初始化指针:

int* pointer = new int;

(之后,delete pointer;不会泄露内存。始终 delete您从new获得的所有内容。) < / p>

此外,指针不必指向动态分配的数据(通过调用new获取),您可以指向自动(堆栈)变量

int func() {
    int valueOnStack = 42;
    int* pointer = &valueOnStack;
    *pointer = 0;
    return *pointer;
}

答案 1 :(得分:2)

因为当你声明Msg 137, Level 16, State 1, Procedure TR_Update, Line 50 Must declare the scalar variable "@TempTable". Msg 137, Level 16, State 1, Procedure TR_Update, Line 50 Must declare the scalar variable "@TempTable". Msg 137, Level 16, State 1, Procedure TR_Update, Line 50 Must declare the scalar variable "@TempTable". Msg 137, Level 16, State 1, Procedure TR_Update, Line 50 Must declare the scalar variable "@TempTable". Msg 137, Level 16, State 1, Procedure TR_Update, Line 50 Must declare the scalar variable "@TempTable". 时,它指向一个完全任意的内存位置。你不能写任何旧的记忆。

您需要先为它分配内存:

pointer

或者只是:

int* pointer = new int;
*pointer = 0;

答案 2 :(得分:1)

指针pointer未初始化,并在您声明时指向内存中的随机位置。它可能指向系统堆栈,或全局变量,或指向程序的代码空间,或指向操作系统。当您说*pointer = 0;时,程序只会尝试将0写入任意随机位置pointer

该程序可能会立即爆炸,或者可能会等待半个小时然后爆炸,或者它可能会轻微破坏程序另一部分中的数据,您可能永远不会意识到这一点。这可能会使此错误很难追查。确保在解除引用之前初始化指向有效地址的所有指针。

答案 3 :(得分:0)

pointer未指向int* pointer;

之后的任何内容

因此取消引用它的行为是未定义的。

如果您已经写过

int n;
pointer = &n;

然后你可以取消引用它。

另外,您可以从

为其分配内存
pointer = new int;

必须记得致电delete pointer;否则您会泄漏记忆。

答案 4 :(得分:-1)

此代码在函数内完全有效:

int *pointer = 0;

但是,它与设置指向NULL宏的指针相同。

如果你试图设置另一个值,编译器会抱怨没有从int到int *的有效转换:

int *pointer = 1;  // Error

但是,如果要为指针指定值,请使用 new并删除跟随TartanLlama的答案。首先分配内存,然后分配一个值:

int *pointer = new int;
*pointer = 1;  // OK
// delete when appropriate