0

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

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

4

2 回答 2

7
ptr3 = ptr2;

ptr3被初始化为 的ptr2NULL。这是NULL因为您没有初始化它并且它具有静态存储持续时间。

然后你做

D = *ptr1 + *ptr3;

您正在取消引用ptr3它是一个空指针:这是未定义的行为。的值ptr2可能在您的程序期间发生了变化,但ptr3仍然是一个空指针。

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

void some_function(void)
{
    int B = 5;
    ptr2 = &B;
}

B对象生命周期在函数some_function退出时结束。返回后无法B访问。它的意思是:ptr2some_function

C = *ptr1 + *ptr2;

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

于 2012-12-31T17:43:00.723 回答
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)在打印语句之后;

于 2012-12-31T17:42:08.107 回答