我正在尝试为指针赋值。此代码工作正常
int i =5;
int *ptr ;
ptr = &i;
printf(" %d\n",*ptr);
但此代码显示错误
int i =5;
int *ptr ;
*ptr = 5;
printf(" %d\n",*ptr);
谁可以给我解释一下这个?
int *ptr
gets initialized to a random location, which possibly points to invalid memory, and you try to write 5 to that location.
当您声明 时int *ptr
,您正在创建一个名为的变量,该变量ptr
可以保存int
. 当您在 中取消引用它时*ptr = 5
,您是在说“将 5 存储在ptr
指向的地址中” - 但由于ptr
未初始化,它指向的位置未定义。所以你正在调用未定义的行为。
Anint *
不存储 an int
,而只是一个指向一个的地址。int
在那个地址仍然必须有一个真实的。
如果要分配int
存在于本地范围之外的 ,可以使用malloc
. 您的示例的简单转换,没有错误检查:
int *ptr = malloc(sizeof(int));
*ptr = 5;
printf(" %d\n",*ptr);
如果您确实使用malloc
,请在完成后记住free
分配的内存:
free(ptr);
The second version assigns 5 to the memory pointed to by ptr
, but you haven't yet initialized ptr
to point to a known location.
So it writes the value to the memory at whatever address happens to be in ptr
, which is whatever was in memory where ptr
was declared.
你不能阻止一个不指向你拥有的地方的指针。
int* ptr;
这会为指针分配空间,但不会为指针指向的块分配空间。
此外,由于它没有被初始化, ptr 有一个不确定的值。这意味着它不仅可能指向您不拥有的东西,而且很难检查它是否是有效指针。初始化指向 NULL(或 nullptr,如果可用)或实际位置(就像您在第一个示例中所做的那样)的指针通常是一个好主意。