因此,我试图使用在函数中定义的全局指针,并且打算在不传递参数的情况下在另一个函数中使用。
这是我的fun.c文件
#include <stdio.h>
#include <stdlib.h>
int *step;
int step_counter;
int init(int num){
step = #
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的新手。
答案 0 :(得分:3)
您的行为不确定。
您将step
指向num
的地址,但是num
是一个局部变量,在init()
返回后被销毁。尝试取消引用step
中的reset_counter()
会给您UB,因为它指向的对象已被破坏。
为什么要使用step
的指针?您可以只使用step = num;
并让step
成为int
。
答案 1 :(得分:1)
此功能
int init(int num){
step = #
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;
}