【问题标题】:qsort funcation work with structre which carry char poiter memberqsort 函数使用带有 char 指针成员的结构
【发布时间】:2019-09-14 12:23:55
【问题描述】:

我无法理解以下 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;
}

【问题讨论】:

  • 你需要阅读更多关于标准qsort的内容,尤其是比较函数应该返回什么。
  • 它的大小是 3 个整数和一个 char 指针加上元素之间添加的任何填充。

标签: c qsort


【解决方案1】:

对于初学者来说,这个比较函数

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 ) + 一个可能的padding 用于对齐。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果大小是众所周知的,因为它只包括指针本身的大小,那么由谁来决定 qsort 结构数组中任何一个结构的起点和终点
    • @megat 你有一个struct player 数组。数组中的每个元素都是sizeof(struct player) 字节大。并且数组是连续的,这意味着结构在数组中彼此跟随。 cricketer[0] 是第一个元素,它是直接,后跟cricketer[1],正好是cricketer[0] 开始之后的sizeof(struct player) 个字节。
    • @megat 如果您打印指向元素的指针,您将看到例如&amp;cricketer[1]&amp;cricketer[0] 正好是 sizeof(struct player) 字节。 qsort 函数使用元素大小来了解数组中每个元素的开始位置。从数组的开头,它可以添加sizeof(struct player) 的倍数以获取数组中的任意元素。
    猜你喜欢
    • 1970-01-01
    • 2014-12-28
    • 2017-02-27
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2010-11-23
    相关资源
    最近更新 更多