【发布时间】:2019-05-06 09:16:41
【问题描述】:
我想知道为什么杰克和乔治的名字没有打印出来。我尝试在结构中添加另一个成员,名称会正常打印,这是为什么呢?如果有人可以提供帮助,我将不胜感激。代码如下:
#include <stdio.h>
typedef unsigned short int u16;
typedef unsigned char u8;
typedef struct
{
u8 name[10];
u16 salary;
u16 bonus;
u16 deduction;
//u8 x;//why does the printed name get ruined
//without this?
}employee;
void main (void)
{
employee arr[3]={{.name = "John"},{.name =
"Jack"},{.name = "George"}};
u16 i = 0;
u16 sum = 0;
for (i = 0; i < 3; i++)
{
printf("\nPlease enter %s's Salary:",arr[i].name);
scanf(" %d",&arr[i].salary);
printf("\nPlease enter %s's Bonus:",arr[i].name);
scanf(" %d",&arr[i].bonus);
printf("\nPlease enter %s's Deduction:",arr[i].name);
scanf(" %d",&arr[i].deduction);
sum = sum + arr[i].salary + arr[i].bonus - arr[i].deduction;
}
printf("\nTotal value needed is: %d",sum);
}
【问题讨论】:
-
您在
scanf中使用了错误的格式说明符,这会导致内存损坏。一个简单的解决方法是改为阅读int而不是“u16”(无论如何您都不应该定义自己,因为该语言已经提供了固定宽度类型) -
开启所有警告(见MM评论)
-
%hu在这种情况下是正确的。但我建议阅读int,然后将其分配回您的结构字段。 -
如果是内存损坏,那么更改内存的“形状”(例如通过在堆栈上添加更多字段或变量)有时会导致损坏发生在部分未使用的内存,或用于其他用途的内存(导致没有症状或不同的症状)