函数之间的全局指针

时间:2019-06-07 15:17:54

标签: c pointers initialization

因此,我试图使用在函数中定义的全局指针,并且打算在不传递参数的情况下在另一个函数中使用。

这是我的fun.c文件

#include <stdio.h>
#include <stdlib.h>

int *step;
int step_counter;

int init(int num){
    step = &num;
    step_counter = *step;
    return 0;

}
void reset_counter(){
    step_counter = *step;
    printf("%d ", step_counter);

}

这是main.c文件

#include <stdio.h>
#include <stdlib.h>
#include "fun.c"

int main()
{
    init(3);
    reset_counter();
return 0;
}

我期望reset_counter函数能够打印3。但是相反,它会打印出0。我不知道这是什么问题。我是C的新手。

2 个答案:

答案 0 :(得分:3)

您的行为不确定。

您将step指向num的地址,但是num是一个局部变量,在init()返回后被销毁。尝试取消引用step中的reset_counter()会给您UB,因为它指向的对象已被破坏。

为什么要使用step的指针?您可以只使用step = num;并让step成为int

答案 1 :(得分:1)

此功能

int init(int num){
    step = &num;
    step_counter = *step;
    return 0;

}

参数num是函数的局部变量。退出该函数后,该变量将不再有效,并且程序的其他部分可以重新使用其内存。

结果,指针step将具有无效值,并且如果程序尝试访问指针所指向的内存,则该程序将具有未定义的行为。

您可以通过以下方式重写该函数。

int init(int num){
    step = malloc( sizeof( *step );

    int success step != NULL;

    if ( success )
    {
        *step = num;
        step_counter = *step;
    }

    return success;
}

您不应忘记在退出程序之前释放指针。

尽管不清楚为什么需要额外的变量step_counter

我将通过以下方式重写代码段

int *step;

int init(int num){
    step = malloc( sizeof( *step ) );

    int success = step != NULL;

    if ( success ) *step = num;

    return success;
}

void reset_step(){
    free( step );
    step = NULL;
}