首页 > 解决方案 > 指针未初始化的问题

问题描述

我正在尝试制作一个程序,询问用户姓名和他们欠公司的金额。问题是,每次我尝试编译程序时,我都会收到这个警告,说“用户可能没有被初始化”。我不太确定那是什么意思。对我做错了什么有帮助吗?谢谢!

#define END  '\0'        
#define LENGTH 20          

struct info
{
   char  lastName[LENGTH]; 
   float payment;
};

int customerS();
void accounts(struct info *userStart, int amount);
void changeNames(struct info *userStart, int amount);
void sort(struct info *userStart, int amount);
void results(struct info *userStart, int amount);

int main()
{
   struct info *user;
   int amount;

    while((amount = customers()) != 0)
   {

      accounts(user, amount);
      changeNames(user, amount);
      sortNames(user, amount);
      results(user, amount);
      free(user);
   }

   return 0;
}

int customers()
{
   int choice;

   do
   {      
      printf("\nHow many customers do you have (2 to 300, 0=quit): ",
      scanf("%d", &choice);
   }
   while((choice < 2|| choice > 300) && choice != 0);
return choice;
}

void accounts(struct info *userStart, int amount)
{
   struct info *user;
   char   *name[LENGTH];
   float  owed;

   for(user = userStart; (user - userStart) < amount; user++)
   {
      scanf (" %s", name[LENGTH]);
      getchar();
      do
      {
         name[LENGTH] = getchar();
         name[LENGTH]++;
      }
      while(!('\n'));
      user->lastName[LENGTH + 1] = END;
      scanf("%f", &owed);
      user->payment = owed;
   }
   return;
}

void changeNames(struct info *userStart, int amount)
{
   char *fast = &userStart->lastName[LENGTH],
        *slow = &userStart->lastName[LENGTH];

   if(tolower(*fast))
      *slow++ = toupper(*fast);       
   while(*fast != END)
   {
      if(!isspace(*fast) || isalpha(*fast))
         *slow++ = tolower(*fast);
      fast++;
   }
   *slow = END;
   return;
}

void sort(struct info *userStart, int amount)
{
   struct info *user;
   char *in,
        *out,
        temp;

   for(out = user->lastName; (out - userStart->lastName) < amount; out++)
   {
      for(in = out + 1; (in - userStart->lastName) < amount; in++)
      {
         if(strcmp(user->lastName, userStart->lastName))
         {
            temp = *out;
            *out = *in;
            *in = temp;
         }
      }
   }
   return;
}
void results(struct info *userStart, int amount)
{
   struct info *user;
   printf("\nName: %s        Payment: $%.2f", user->lastName,  user->payment);
   return;
}

标签: carraysinitialization

解决方案


结构信息*用户;

这分配了一个指向用户结构的指针,而不是结构本身。

因此,您可以通过在堆栈上分配它struct info user;并将 &user 传递给函数,或者通过动态分配它user = (struct info*)malloc( sizeof(struct info) )

无论哪种方式都应该避免您的分段错误(因为指针未初始化)。..)


推荐阅读