指向结构中数组的指针

A pointer to the array in a struct

qsort的第一个参数需要一个指向数组的指针... 在这种情况下我如何传递指针?

typedef struct apData {
  char ssid[32];
  sint8 rssi;
  AUTH_MODE authmode;
  char bssid[18];
  int32_t channel;
  uint8 is_hidden;
} AP;

//BSSs SCANNED
typedef struct {
  bool scanInProgress = NOT_SCANNING;
  AP **apData;
  int numAPs;
} Scan;
static Scan scanAPs;

...

问题出在传递第一个参数... 我不明白为什么我在 compareRSSI() 函数中得到垃圾

qsort(scanAPs.apData, scanAPs.numAPs, sizeof(struct apData), compareRSSI);

...

int compareRSSI(const void *bss1, const void *bss2) {
  int firstAP = ((struct apData *)bss1)->rssi;
  int secondAP = ((struct apData *)bss2)->rssi;

  return (secondAP - firstAP);
}```

您正在向 qsort 传递一个指向 指针数组的指针 apData 的类型为 AP**),但是您'是说数组的每个元素都是sizeof(struct apData)(就好像它是结构的数组)。那是哪一个?

您没有说明如何为 scanAPs.apData 赋值,也没有说明为要排序的数组元素分配存储空间的位置。因此,不幸的是,不清楚您是打算对指针数组进行排序,还是打算对 apData 结构数组进行排序。

如果类型声明正确并且您有一个指针数组...

因为 apData 的类型是 AP **,那么你会有一个指向某处结构的指针数组。在这种情况下,您的排序调用应该如下所示:

qsort(scanAPs.apData, scanAPs.numAPs, sizeof(struct apData*), compareRSSI);

注意sizeof表示数组的每个元素都是一个指针

如果类型声明错误并且您有一个结构数组...

如果是类型错误,则需要将apData的类型改为AP*,并将其设置为指向数组中第一个结构的指针。您需要在某处分配一个适当的值,并验证您是否也正确地为数组分配了存储空间。

在分配 apData 值时,不要 使用 C 风格的转换,因为编译器将确保您拥有正确的类型。

这是我的解决方案!这些人帮了我很多。 link!

qsort(scanAPs.apData, scanAPs.numAPs, sizeof(struct apData*), compareRSSI);

...

int compareRSSI(const void *bss1, const void *bss2) {
  struct apData **firstAP = (struct apData **)bss1;
  struct apData **secondAP = (struct apData **)bss2;
  return ((*secondAP)->rssi - (*firstAP)->rssi);
}