Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C qsort函数使用带有字符指针成员的结构_C_Qsort - Fatal编程技术网

C qsort函数使用带有字符指针成员的结构

C qsort函数使用带有字符指针成员的结构,c,qsort,C,Qsort,我无法理解下面的qsort调用qsort(板球手,7岁,sizeof(结构球员),comp) 如何计算“struct player”的大小,因为struct player中的成员char*name不是静态的 struct player { char* name; int age, ntm, ar; } cricketer[20]={ "sam",35,10,300, "ram",55,15,200,

我无法理解下面的qsort调用
qsort(板球手,7岁,sizeof(结构球员),comp)

如何计算“struct player”的大小,因为struct player中的成员char
*name不是静态的

struct player
{
    char* name;
    int age, ntm, ar;
}

cricketer[20]={
                "sam",35,10,300,
                "ram",55,15,200,
                "aman",45,19,300,
                "raman",65,22,400,
                "mani",75,25,350,
                "mono",76,10,215,
                "verma",88,16,103
    };
int comp(const void* a,const void* b)
{
    const struct player * x = (const struct player*)a;
    const struct player * y = (const struct player*)b;
    if(x->age > y->age)return 1;
    else return 0;
}

void read()
{
for (int i = 0; i < 7; i++)
    printf("\n\t\tName : %s\t\tAge : %d\t\tNum of Matches : %d\t\tTotal score : %d\n\n ", cricketer[i].name, cricketer[i].age, cricketer[i].ntm, cricketer[i].ar);
}

int main()
{
    read();
    printf("\n\t\tAfter Qsort : %d\n", sizeof(struct player));
    qsort(cricketer,7,sizeof(struct player),comp);
    read();
    return 0;
}
struct播放器
{
字符*名称;
国际年龄,ntm,ar;
}
板球运动员[20]={
“山姆”,35,10300,
“拉姆”,55,15200,
“阿曼”,45,19300,
“拉曼”,65,22400,
“马尼”,75,25350,
“mono”,76,10215,
“verma”,88,16103
};
内部组件(常数无效*a,常数无效*b)
{
常量结构播放器*x=(常量结构播放器*)a;
常量结构播放器*y=(常量结构播放器*)b;
如果(x->age>y->age)返回1;
否则返回0;
}
无效读取()
{
对于(int i=0;i<7;i++)
printf(“\n\t\t名称:%s\t\t阶段:%d\t\t比赛次数:%d\t\t总分:%d\n\n”,板球手[i]。姓名,板球手[i]。年龄,板球手[i]。ntm,板球手[i]。ar);
}
int main()
{
read();
printf(“\n\t\t在Qsort:%d\n之后”,sizeof(struct player));
qsort(板球运动员,7岁,sizeof(结构球员),康普);
read();
返回0;
}

结构包含指针
名称
,而不是指针实际指向的内存。因此,大小是众所周知的,因为它只包括指针本身的大小。

对于初学者,此比较函数

int comp(const void *a,const void *b)
{
    const struct player *x=(const struct player*)a; const struct player *y=(const struct player*)b;
    if(x->age > y->age)return 1;



    else return 0;
}
这是无效的。它应返回三个值:正、负或零,取决于比较的值。但该函数只返回两个值:1或0

该结构包含四个成员

struct player{
    char *name;
    int age,ntm,ar;
};
因此,其大小的计算方法类似于
sizeof(char*)
+
sizeof(int)
+
sizeof(int)
+
sizeof(int)
+一个可用于对齐的
填充


也就是说,结构的大小在编译时是已知的,与数据成员
name
指向的字符串无关。数据成员
name
指向的字符串不是结构的成员。例如,指针可以用NULL初始化。

您需要了解更多有关该标准的信息,特别是比较函数应该返回的值。它是3个整数和一个字符指针的大小加上元素之间添加的任何填充。如果已知大小,因为它只包括指针本身的大小,那么谁来决定qsort@megat您有一个
结构的数组播放器
。数组中的每个元素都有
sizeof(struct player)
字节大。和数组是连续的,这意味着结构在数组中彼此跟随
cricketer[0]
是第一个元素,紧跟其后的是
cricketer[1]
,它正好是
sizeof(struct player)
cricketer[0]
@megat开始后的字节数。如果您打印指向元素的指针,您将看到
&cricketer[1]
&cricketer[0]之间的区别
正好是
sizeof(struct player)
字节。而
qsort
函数使用元素大小来知道数组中每个元素的起始位置。从数组开始,它可以添加多个
sizeof(struct player)
,以访问数组中的任意元素。