变量'pminutes'正在使用而未初始化

时间:2017-01-14 08:44:45

标签: c pointers

我不断收到此错误消息:

  

正在使用变量'pminutes'而未初始化。

这是我的代码:

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

void ConvertMinutesToHM(int time_minutes, int *phours, int *pminutes);

void main ()
{
    int min, *phours, *pminutes;
    printf("Enter a number of minutes:\n");
    scanf("%d", &min);
    ConvertMinutesToHM(min, phours, pminutes);
    printf("Hours=%d", phours);
    printf("Minutes=%d", pminutes);
}

void ConvertMinutesToHM (int time_minutes, int *phours, int *pminutes)
{
    int hours, minutes; 
    *phours = time_minutes / 60;
    *pminutes = time_minutes % 60 * 60;

}

4 个答案:

答案 0 :(得分:2)

因为在将pminutes传递给main函数之前,您尚未在ConvertMinutesToHM()中初始化main。请记住,在将所有参数传递给函数之前,需要初始化所有参数 - 否则函数如何知道要处理哪些值?

int中,您应该只需要正常int min = 0, phours = 0, pminutes = 0; 并正确初始化它们:

ConvertMinutesToHM()

在调用ConvertMinutesToHM(min, &phours, &pminutes); 时,您可以传入相应变量的地址:

ConvertMinutesToHM()

编辑:您在hours, minutes函数中也犯了其他错误:完全不需要本地pminutes,而void ConvertMinutesToHM(int time_minutes, int *phours, int *pminutes); int main() { int min = 0, phours = 0, pminutes = 0; printf("Enter a number of minutes:\n"); scanf("%d",&min); ConvertMinutesToHM(min,&phours,&pminutes); printf("Hours=%d\n",phours); printf("Minutes=%d\n",pminutes); } void ConvertMinutesToHM (int time_minutes, int *phours, int *pminutes) { *phours=time_minutes/60; *pminutes=time_minutes%60; } 的计算没有任何意义。

示例修复:

VBox

答案 1 :(得分:2)

在c编程语言中,程序员不是全局或静态或显式初始化的变量根本没有初始化,读取它们会导致未定义的行为。

您正在将它传递给将取消引用指针的函数,并且由于它未被初始化,因此函数将从内存中的未确定位置读取,因为指针所持有的值未在任何地方定义。这并不意味着指针没有保存值,这意味着该值是一个随机垃圾值,不能用作地址,但如果您不小心并取消引用它。

你可以通过指向一个将在堆栈上分配的实际变量并使其指向有效内存来初始化它,就像这样

int minutes;
int *pminutes = &minutes;

当然,您可以直接传递&minutes,但这样,pminutes指针将保存堆栈变量minutes的地址,该地址已正确分配,但未初始化。< / p>

minutes变量不需要初始化,因为它旨在用作函数将读取并存储到pminutes所指向的任何值的存储。

问题是pminutes是一个指针,当程序试图读取它所持有的地址时,不初始化它将导致未定义的行为。

显式初始化大多数变量仍然是一种很好的做法,但是当你确定它们将在某个地方被初始化并且添加显式初始化没有意义时,我也认为不要这样做是好的做法,从而使得代码更难理解。

答案 2 :(得分:0)

您正在使用未初始化的指针。具有静态存储的指针使用空指针初始化。具有自动存储持续时间的指针未初始化。

来自C89标准:

  

C89 §3.5.7 Initialization

     

如果没有显式初始化具有静态存储持续时间的对象,则会隐式初始化它,就像每个具有算术类型的成员都被赋值为0而每个具有指针类型的成员都被赋予空指针常量。如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。

参见ISO C 99 6.7.8.10:

  

如果没有显式初始化具有自动存储持续时间的对象,则其值为   不定。如果未明确初始化具有静态存储持续时间的对象,   然后:

     
      
  • 如果它有指针类型,则将其初始化为空指针;
  •   

您正在定义int *pminutes而不是初始化它,因此它的值是不确定的,然后执行*pminutes = time_minutes%60*60尝试访问该不确定的位置并导致未定义的行为。

答案 3 :(得分:0)

以下代码:

  1. 干净地编译
  2. 执行所需的操作
  3. 纳入对OP问题的评论
  4. 现在是代码

    #include <stdio.h>  // printf(), scanf(), perror()
    #include <stdlib.h> // exit(), EXIT_FAILURE
    //#include <math.h>
    
    void ConvertMinutesToHM(int time_minutes, int *phours, int *pminutes);
    
    int main ( void )
    {
        int min;
        int hours;
        int minutes;
    
        printf("Enter a number of minutes:\n");
        if( 1 != scanf("%d", &min) )
        {
            perror( "scanf failed to read the minutes from the user" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, scanf successful
    
        ConvertMinutesToHM(min, &hours, &minutes);
    
        printf("Hours=%d\n", hours);
        printf("Minutes=%d\n", minutes);
    } // end function: main
    
    
    void ConvertMinutesToHM (int time_minutes, int *phours, int *pminutes)
    {
        //int hours, minutes;
        *phours = time_minutes / 60;
        *pminutes = time_minutes % 60;
    } // end function: ConvertMinutestoHM
    

    以下是终端上显示的结果:

    Enter a number of minutes:
    100
    Hours=1
    Minutes=40