我想知道为什么杰克和乔治的名字无法打印。我尝试在结构中添加另一个成员,这样名称可以正常打印,为什么呢?如果有人可以提供帮助,我将不胜感激。这是代码:
primeusers[1]
答案 0 :(得分:3)
这是因为您的scanf()错误,并且正在覆盖结构的成员。
一个不错的编译器会发出很多非常严重的警告:
$ gcc -Wall t.c
t.c:13:11: warning: return type of ‘main’ is not ‘int’ [-Wmain]
void main (void)
^~~~
t.c: In function ‘main’:
t.c:22:14: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘u16 *’ {aka ‘short unsigned int *’} [-Wformat=]
scanf(" %d",&arr[i].salary);
~^ ~~~~~~~~~~~~~~
%hd
t.c:24:14: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘u16 *’ {aka ‘short unsigned int *’} [-Wformat=]
scanf(" %d",&arr[i].bonus);
~^ ~~~~~~~~~~~~~
%hd
t.c:26:14: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘u16 *’ {aka ‘short unsigned int *’} [-Wformat=]
scanf(" %d",&arr[i].deduction);
~^ ~~~~~~~~~~~~~~~~~
%hd
呼叫scanf(" %d",&arr[i].salary);
时,%d
表示将读取的数字存储为int类型。
但是您已经将salary
声明为u16
类型,这在您的系统上可能比int
小得多。 scanf
假定您提供%d
时您是在讲真话,并且将一个int存储在&arr[i].salary
指针指向的任何位置,然后覆盖该变量之后的内存,该变量可能会覆盖{ 1}}数组。
所以
name
声明为salary, bonus and deduction
而不是int
,因此它与您为u16
赋予的%d
参数匹配
或scanf
变量scanf
提供u16
的正确类型说明符。例如
%hu