全局指针和本地指针有什么区别?

时间:2012-12-31 17:38:22

标签: c++ c pointers global-variables

我有一个像这样的小代码:

 #include <stdio.h>

    int *ptr1;
    int *ptr2;


  void some_function(void)
    {

    int B = 5;
    ptr2 = &B;
    }

  main (){
    int C, D;
    int A =10;
    int *ptr3;
    ptr1= &A;

    ptr3=ptr2;

    some_function();

    C = *ptr1 + *ptr2;

    printf("Sum of the numbers C= %d\n",C);

    some_function();
    D = *ptr1 + *ptr3;

    printf("Sum of the numbers D= %d\n",D);

  }

为什么我不得到D的结果但得到C的结果?我得到了print语句S um of the numbers C=15的结果,但是对于D的最后一个print语句没有任何结果。本地和全局指针之间有什么区别(我的意思是ptr1和ptr2都是全局定义的,而ptr3是定义本地的)?指针赋值ptr3=ptr2是否有效?指向局部变量Vs的指针是否有任何显着差异?指向全局变量的指针?

2 个答案:

答案 0 :(得分:7)

ptr3 = ptr2;

ptr3初始化为ptr2,即NULL。它是NULL,因为您没有初始化它并且它具有静态存储持续时间。

然后你做

D = *ptr1 + *ptr3;

您正在取消引用ptr3这是一个空指针:这是未定义的行为。 ptr2的值在您的程序中可能已更改,但ptr3仍为空指针。

编辑:为了完整起见(嗯,有点):

void some_function(void)
{
    int B = 5;
    ptr2 = &B;
}
当函数B退出时,

some_function对象生存期结束。在B返回后,您无法通过ptr2访问some_function。这意味着:

C = *ptr1 + *ptr2;

也会调用未定义的行为,因为您正在解除引用ptr2,这是此语句中的无效指针。

答案 1 :(得分:2)

ptr3=ptr2; 在调用函数 some_function();之前应对,因此分配给ptr3的错误地址为NULL,因为ptr2为0(默认为全局值)变量)。

这样做:

some_function();
ptr3=ptr2;
D = *ptr1 + *ptr3;
printf("Sum of the numbers D= %d\n",D);  

此外,以下代码运行正确,因为在调用ptr2函数后使用some_function();值。

some_function();
C = *ptr1 + *ptr2;
printf("Sum of the numbers C= %d\n",C)  

噢!,变量ptr2的范围指向some_function()的本地。

void some_function(void)
    {

    int B = 5;
    ptr2 = &B;
    }

这样做:

void some_function(void)
    {

    int* B = calloc(1,sizeof(int));
    *B = 5; 
    ptr2 = B;
    }  

在打印声明之后也不要忘记free(ptr2);