qsort 函数使用带有 char 指针成员的结构
qsort funcation work with structre which carry char poiter member
我无法理解以下 qsort 调用 qsort(cricketer,7,sizeof(struct player),comp);
"struct player"的大小是如何计算的,因为在struct player member 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;
}
该结构包含 指针 name
,而不是指针可能实际指向的内存。因此大小是众所周知的,因为它只包括指针本身的大小。
对于初学者这个比较函数
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;
}
无效。它应 return 三个值:正值、负值或零,具体取决于比较值。但是函数 returns 只有两个值:1 或 0。
该结构包含四个成员
struct player{
char *name;
int age,ntm,ar;
};
所以它的大小计算如下 sizeof( char * )
+ sizeof( int )
+ sizeof( int )
+ sizeof( int )
+ 一个可能的 padding
用于对齐。
也就是说,结构的大小在编译时是已知的,与数据成员指向的字符串无关 name
。数据成员 name
指向的字符串不是该结构的成员。比如指针可以用NULL初始化。
我无法理解以下 qsort 调用 qsort(cricketer,7,sizeof(struct player),comp);
"struct player"的大小是如何计算的,因为在struct player member 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;
}
该结构包含 指针 name
,而不是指针可能实际指向的内存。因此大小是众所周知的,因为它只包括指针本身的大小。
对于初学者这个比较函数
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;
}
无效。它应 return 三个值:正值、负值或零,具体取决于比较值。但是函数 returns 只有两个值:1 或 0。
该结构包含四个成员
struct player{
char *name;
int age,ntm,ar;
};
所以它的大小计算如下 sizeof( char * )
+ sizeof( int )
+ sizeof( int )
+ sizeof( int )
+ 一个可能的 padding
用于对齐。
也就是说,结构的大小在编译时是已知的,与数据成员指向的字符串无关 name
。数据成员 name
指向的字符串不是该结构的成员。比如指针可以用NULL初始化。