将值分配给c中的指针

时间:2013-11-14 18:38:57

标签: c pointers

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

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

但此代码显示错误

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

有人可以向我解释这个吗?

4 个答案:

答案 0 :(得分:2)

int *ptr被初始化为一个随机位置,可能指向无效内存,并且您尝试将5写入该位置。

答案 1 :(得分:2)

当您声明int *ptr时,您正在创建一个名为ptr的变量,该变量可以保存int的地址。当您在*ptr = 5中取消引用它时,您说“在ptr指向的地址中存储5” - 但由于ptr未初始化,它指向的位置未定义。所以你要调用未定义的行为。

int *不会存储int,而只会存储指向一个地址的地址。该地址仍然必须有一个真正的int

如果要分配存在于本地范围之外的int,可以使用malloc。在没有错误检查的情况下对您的示例进行简单转换:

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

如果您使用malloc,请在完成后记住free已分配的内存:

free(ptr);

答案 2 :(得分:0)

第二个版本为ptr指向的内存分配5,但您尚未初始化ptr以指向已知位置。

因此它将值写入内存中的任何地址ptr,这是内存中声明ptr的内容。

答案 3 :(得分:0)

你无法威慑一个指向你所拥有的地方的指针。

int* ptr;

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

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