itsMe
itsMe

Reputation: 51

using qsort function to sort a struct

so I need to use qsort() to sort an array that contains a structure

#include <stdio.h>

// =========
struct pair
{
    int encounters;
};// pair{}

int compaireEncounters(const void*, const void*);

int main()
{
    struct pair* working[5];
    working[0]->encounters = 10;
    working[1]->encounters = 3;
    working[2]->encounters = 1;

    qsort(working, 5, sizeof(struct pair), compareEncounters);
    int i = 0;
    while (i < 3)
    {
        printf("%d \n", working[i]->encounters)
        i++;
    }

}

int compaireEncounters(const void* av, const void* bv)
{
    int a = ((struct pair*)av)->encounters;
    int b = ((struct pair*)bc)->encounters;
    return(a > b);
}

I am trying to get the output:

1 
3
10

but instead i get a segmentation fault core dump.

What is the issue here?

Upvotes: 0

Views: 89

Answers (1)

MikeCAT
MikeCAT

Reputation: 75062

You must assign pointers to valid buffers before dereferencing pointers.

In this case, working should be an array of the structure, not an array of pointers.

Also don't forget to initialize all elements to be sorted.

There are also more mistakes in your code:

  • qsort is used without including proper header (stdlib.h)
  • Undeclared compareEncounters is used in the main function.
  • A semicolon is missing after the printf() statement.
  • Undeclared bc is used in the compaireEncounters function.

Fixed code:

#include <stdio.h>
#include <stdlib.h>

// =========
struct pair{
    int encounters;
};// pair{}

int compaireEncounters(const void* , const void*);

int main() {
    struct pair working[5];
    working[0].encounters = 10;
    working[1].encounters = 3;
    working[2].encounters = 1;
    working[3].encounters = 334;
    working[4].encounters = 42;

    qsort(working, 5, sizeof(struct pair), compaireEncounters);
    int i = 0;
    while (i < 3) {
        printf("%d \n", working[i].encounters);
        i++;
    }

}

int compaireEncounters(const void* av, const void* bv){
    int a = ((struct pair*)av)->encounters;
    int b = ((struct pair*)bv)->encounters;
    return(a > b);
}

If you want to work with an array of pointers,

  • Allocate buffers and assign them before dereferencing.
  • Fix the element size for qsort().
  • Fix compaireEncounters to compare the pointers to the structure.
#include <stdio.h>
#include <stdlib.h>

// =========
struct pair{
    int encounters;
};// pair{}

int compaireEncounters(const void* , const void*);

int main() {
    struct pair* working[5];
    working[0] = malloc(sizeof(*working[0])); working[0]->encounters = 10;
    working[1] = malloc(sizeof(*working[1])); working[1]->encounters = 3;
    working[2] = malloc(sizeof(*working[2])); working[2]->encounters = 1;
    working[3] = malloc(sizeof(*working[3])); working[3]->encounters = 334;
    working[4] = malloc(sizeof(*working[4])); working[4]->encounters = 42;

    qsort(working, 5, sizeof(*working), compaireEncounters);
    int i = 0;
    while (i < 3) {
        printf("%d \n", working[i]->encounters);
        i++;
    }

}

int compaireEncounters(const void* av, const void* bv){
    int a = (*(struct pair**)av)->encounters;
    int b = (*(struct pair**)bv)->encounters;
    return(a > b);
}

Upvotes: 1

Related Questions