影响到另一个后的自由指针

时间:2014-12-09 08:34:34

标签: c linux

我有以下源代码示例:

#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? 如果我影响ptr1ptr2并制作ptr1 NULL,则ptr2在这种情况下必须为NULL? 如何在NULL中获得ptr2

6 个答案:

答案 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)

我认为你将指针(它存储的地址)的值与指向的值混淆。当两个指针ptr1ptr2指向同一个地址时,更改地址指向的值将影响两个指针。但是指针存储商店(他们指向的地址)的地址仍然可以不同!因此,请注意区分指针(它的地址)的值和指向的值。

答案 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

的分配

ptr1ptr2保持相同的值,但彼此没有任何关联。它与

相同
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