我注意到如果我在函数中创建一个指针,它就不会让我为它设置一个值。 例如:
int func() {
int* pointer;
*pointer = 0 //error I get: "Exception: STATUS_ACCESS_VIOLATION"
return *pointer;
}
我得到的不是让你在函数中设置指针,因为如果我使用普通的int它可以工作:
int func() {
int notAPointer;
notAPointer = 0;
return notAPointer;
}
任何人都可以向我解释为什么会这样吗?
答案 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