ove*_*ood 0 c structure scanf segmentation-fault bit-fields
这是C语言.当我运行以下程序时,无论我给出的值有多小,我都会得到运行时分段错误.请帮我找出原因.
#include <stdio.h>
#include <stdlib.h>
struct date
{
unsigned day:
5;
unsigned month:
4;
unsigned year:
12;
};
struct emp
{
char name[10];
struct date d;
};
int compare(const void * a, const void * b)
{
struct emp *orderA = (struct emp *)a;
struct emp *orderB = (struct emp *)b;
return ( orderA->d.year - orderB->d.year );
}
int main ()
{
int i;
struct emp e[5];
for (i = 0;i < 5;i++)
{
scanf("%s %d %d %d", e[i].name, e[i].d.day, e[i].d.month, e[i].d.year);
}
qsort(e, 5, sizeof(struct emp), compare);
for (i = 0;i < 5;i++)
{
printf("%s %d %d %d\n", e[i].name, e[i].d.day, e[i].d.month, e[i].d.year);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当你想scanf()扫描你的东西时,你必须传递东西的地址,而不是实际的东西.(如果你没有传递某些东西的地址scanf(),那么如何scanf()在其中存储一个值?)
现在,在C中,当你引用一个数组时,e[i].name你实际上指的是数组的第一个元素的地址,所以你不必对此做任何特别的事情.(除了小心不要输入超过9个字符的名称,wh00ps,这是非常不安全的,小心!)
但是对于整数,比如e[i].d.day等,你不能只是按int原样传递,因为scanf()需要指针,所以它会把你int当作一个指向一个指针int,所以它会允许用户输入一个数字,然后就会尝试将数字存储在该指针指向的位置,这只是内存中的一些随机位置,因而是段错误.
所以,当你想扫描一个时int,你必须传递地址int,如下所示:&e[i].d.day
除了当整数是记录的字段时,你不能取其地址,因为它没有自己的地址,它存在于存储在地址的某些位中.
所以,我担心你将不得不写一个特殊的函数来读取struct date你的那些,你必须声明个别的ints,传递它们的地址scanf(),然后将结果值存储在一个struct date.