我有以下源代码示例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr1,*ptr2; // two pointers of type int
ptr2=ptr1;
ptr1=NULL;
if(ptr2==NULL)
printf("OK Clean\n");
else
printf("KO not clean\n");
}
我想知道为什么指针ptr2
不是NULL
,我总是KO not clean
?
如果我影响ptr1
至ptr2
并制作ptr1
NULL
,则ptr2
在这种情况下必须为NULL
?
如何在NULL
中获得ptr2
?
答案 0 :(得分:1)
这是未定义的行为:您将ptr2
分配给未初始化的值ptr1
。
写ptr1 = ptr2 = NULL;
会很安全。 NULL
是唯一可以分配给指针的文字值,而不使用address-of运算符&
。 (作为进一步的评论,你不应该假设 NULL
与内存地址0相关:标准没有。
答案 1 :(得分:0)
您要将ptr1的地址分配给指针ptr2。所以这就是不为空的原因。
ptr2=ptr1;
您希望将指针设为null。你可以像这样分配。
ptr2=ptr1=NULL; or
ptr2=NULL;
答案 2 :(得分:0)
与@Bathsheba一样,这有undefined behaviour
问题。但我认为@Issam想知道为什么ptr2
没有改变
对于下面的代码:
int *ptr1,*ptr2; // two pointers of type int
int num = 2;
ptr2=ptr1 = #
ptr1 = NULL;
if(ptr2==NULL)
printf("OK Clean\n");
else
printf("KO not clean\n");
结果仍为KO
point equal
表示2个点具有相同的内存地址,当ptr1
指向NULL
时,它不会对ptr2
生效。
答案 3 :(得分:0)
分配ptr2 = ptr1
仅表示当时 ptr2和ptr1指向相同的内存。但是,当您稍后修改指针ptr1
时,它们会再次不同。
改变指向值:
会有所不同int i = 5;
int * ptr1, *ptr2;
ptr1 = ptr2 = &i;
*ptr2 = 3;
然后*ptr1
也有值3.
答案 4 :(得分:0)
我认为你将指针(它存储的地址)的值与指向的值混淆。当两个指针ptr1
和ptr2
指向同一个地址时,更改地址指向的值将影响两个指针。但是指针存储商店(他们指向的地址)的地址仍然可以不同!因此,请注意区分指针(它的地址)的值和指向的值。
答案 5 :(得分:0)
这里有两个问题。
ptr2 = ptr1
无效。 ptr1
的作业不会改变ptr2
?分配无效
ptr1
未初始化,价值是垃圾。 ptr2
的分配会导致未定义的行为。该计划已经破裂。
要解决此问题,请使用有效地址初始化ptr1
:
int a = 2;
int * ptr1 = &a; // Initialize ptr1
int * ptr2;
ptr2 = ptr1; // Assigment OK, ptr1 has valid address
ptr1
未更改ptr2
ptr1
和ptr2
保持相同的值,但彼此没有任何关联。它与
int a = 1, b = 2;
a = b; // a is now 2
b = 0; // a is still 2
如果更改ptr1
的值应反映在ptr2
上,则应该指向指针:
int * ptr1 = &a;
int ** ptr2;
ptr2 = &ptr1;
ptr1 = NULL;
if(*ptr2 == NULL) // Test value of ptr1 through ptr2