该程序会打印出常量营养素(碳水化合物,脂肪和蛋白质)的数量乘以卡路里密度。
但是,当我尝试对结果进行求和时,所有代码都很好,但是,由于某种原因,代码会替换最后一个指针(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.
答案 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;
}