我正在尝试为指针赋值。 这段代码工作正常
int i =5;
int *ptr ;
ptr = &i;
printf(" %d\n",*ptr);
但此代码显示错误
int i =5;
int *ptr ;
*ptr = 5;
printf(" %d\n",*ptr);
有人可以向我解释这个吗?
答案 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,如果可用)或实际位置(如第一个示例中所做的那样)通常是个好主意。