0

我正在尝试为指针赋值。此代码工作正常

int i =5;   
int *ptr ;   
ptr = &i;   
printf(" %d\n",*ptr);   

但此代码显示错误

int i =5;   
int *ptr ;   
*ptr = 5;   
printf(" %d\n",*ptr);   

谁可以给我解释一下这个?

4

4 回答 4

2

int *ptr gets initialized to a random location, which possibly points to invalid memory, and you try to write 5 to that location.

于 2013-11-14T18:42:11.330 回答
2

当您声明 时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);
于 2013-11-14T18:43:00.833 回答
0

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.

于 2013-11-14T18:41:53.297 回答
0

你不能阻止一个不指向你拥有的地方的指针。

int* ptr;

这会为指针分配空间,但不会为指针指向的块分配空间。

此外,由于它没有被初始化, ptr 有一个不确定的值。这意味着它不仅可能指向您不拥有的东西,而且很难检查它是否是有效指针。初始化指向 NULL(或 nullptr,如果可用)或实际位置(就像您在第一个示例中所做的那样)的指针通常是一个好主意。

于 2013-11-14T18:43:34.510 回答