指针被最后一次指针调用替换?

时间:2017-10-10 04:59:25

标签: c pointers

该程序会打印出常量营养素(碳水化合物,脂肪和蛋白质)的数量乘以卡路里密度。

但是,当我尝试对结果进行求和时,所有代码都很好,但是,由于某种原因,代码会替换最后一个指针(prot_ptr)之前的所有指针。

这是源代码:

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

#define CARB_CAL 4
#define PROT_CAL 4
#define FAT_CAL 9

int *fat_ptr;
int *prot_ptr;
int *carb_ptr;

void ask_name(void);
void ask_fat(void);
void ask_carb(void);
void ask_prot(void);

// main function
int main (int argc, char *argv[])
{
    // food name 
    ask_name();
    ask_fat();
    ask_carb();
    ask_prot();

    int sum = *fat_ptr + *carb_ptr + *prot_ptr;
    printf("total calories: %d\n", sum);
}

void ask_name(void)
{
    char *name;
    printf("input the name of the meal item: ");
    name = malloc(6 * sizeof(char));
    scanf("%s", name);  
    printf("\nMEAL NAME: %s\n", name);
    free(name);
}

// fats
void ask_fat(void)
{
    int fat;
    printf("\ninput the quantity of fat: ");
    scanf("%d", &fat); 
    printf("\n");
    printf("fat calories: %d\n",  (fat * FAT_CAL));

    int int_fat = (fat * FAT_CAL);
    fat_ptr = &int_fat;
}

// carbs
void ask_carb(void)
{
    int carb;
    printf("\ninput the quantity of carbs: ");
    scanf("%d", &carb); 
    printf("\n");
    printf("carb calories: %d\n",  (carb * CARB_CAL));

    int int_carb = (carb * CARB_CAL);
    carb_ptr = &int_carb;
}

// proteins
void ask_prot(void)
{
    int prot;
    printf("\ninput the quantity of protein: ");
    scanf("%d", &prot); 
    printf("\n");
    printf("protein calories: %d\n",  (prot * PROT_CAL));

    int int_prot = (prot * PROT_CAL);
    prot_ptr = &int_prot;
}

这是一个示例输出:

  

./学习输入餐食的名称:米饭

     饭菜名称:米饭

     

输入脂肪量:1

     脂肪卡路里:9

     

输入碳水化合物的数量:12

     碳水化合物卡路里:48

     

输入蛋白质的量:3

     

蛋白质卡路里:12

     

总卡路里:36

期望的结果是总和9 + 48 + 12,但程序的作用是,它总和12 + 12 + 12.

2 个答案:

答案 0 :(得分:1)

您正在将临时变量的地址复制到全局指针。这会在稍后加入指针时导致未定义的行为。

由于函数只返回一个值,因此可以考虑使用函数的返回值并将总和计算为总和:

int ask_fat(void)
{
    int fat;
    printf("\ninput the quantity of fat: ");
    scanf("%d", &fat);

    fat = fat * FAT_CAL;
    printf("\nfat calories: %d\n", fat);

    return fat;
}

对其余功能执行相同操作,然后在main中计算摘要,如下所示:

int main (int argc, char *argv[])
{
    ask_name();

    int sum = ask_fat() + ask_carb() + ask_prot();
    printf("total calories: %d\n", sum);
}

或者,如果您确实需要使用全局变量,那么只需将它们更改为非指针并将值保存在相应的ask_函数中。但是请注意在这种情况下不需要全局变量,因此最好避免它们。

答案 1 :(得分:1)

你必须使用指针吗?指针是问题的根源。我会使用函数返回一个int然后操纵指针地址。这是一个适用于您正在做的事情的代码。如果你真的需要使用指针,我将编辑它而不需要使用临时变量地址。

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

#define CARB_CAL 4
#define PROT_CAL 4
#define FAT_CAL 9

int fat;
int prot;
int carb;

void ask_name(void);
int ask_fat(void);
int ask_carb(void);
int ask_prot(void);

// main function                                                                                                                                                                                                                                                        
int main (int argc, char **argv)
{
  // food name                                                                                                                                                                                                                                                          
  ask_name();
  fat = ask_fat();
  carb = ask_carb();
  prot = ask_prot();

  int sum = fat + carb + prot;
  printf("total calories: %d\n", sum);
}

void ask_name(void)
{
  char *name;
  printf("input the name of the meal item: ");
  name = malloc(6 * sizeof(char));
  scanf("%s", name);
  printf("\nMEAL NAME: %s\n", name);
  free(name);
}

// fats                                                                                                                                                                                                                                                                 
int ask_fat(void)
{
  int fat;
  printf("\ninput the quantity of fat: ");
  scanf("%d", &fat);
  printf("\nfat calories: %d\n",  (fat * FAT_CAL));

  int int_fat = (fat * FAT_CAL);
  return int_fat;
}

// carbs                                                                                                                                                                                                                                                                
int ask_carb(void)
{
  int carb;
  printf("\ninput the quantity of carbs: ");
  scanf("%d", &carb);
  printf("\ncarb calories: %d\n",  (carb * CARB_CAL));

  int int_carb = (carb * CARB_CAL);
  return int_carb;
}