C qsort fn 分段错误

问题描述 投票:0回答:1

我有以下比较功能:

  int compareByMemSize(const void *a, const void *b)
  {                                                                                                                                                                                           
      const struct ProcInfo *procInfo1 = (const struct ProcInfo *) a;
      const struct ProcInfo *procInfo2 = (const struct ProcInfo *) b;
   
      if (( procInfo1->memSize != NULL && procInfo1->memSize[0] != '\0' ) && ( procInfo2->memSize != NULL && procInfo2->memSize[0] != '\0' ))
      {
          long memSize1 = strtol(procInfo1->memSize, NULL, 10);
          long memSize2 = strtol(procInfo2->memSize, NULL, 10);
   
          if (memSize1 < memSize2)
              return -1;
          if (memSize1 > memSize2)
              return 1;
          return 0;
      }
   
      if (procInfo1->memSize == NULL && procInfo2->memSize == NULL)
          return 0;
      if (procInfo1->memSize == NULL)
          return -1;
      return 1;
  }

对以下结构进行比较逻辑:

  typedef struct ProcInfo {                                                                                                                                                                   
      int  PID;
      char *name;
      char *memSize;
  } ProcInfo;

我像这样进行 qsort 调用:

qsort(&a, sizeof(a), sizeof(ProcInfo), compareByMemSize);    

其中 a 是 ProcArray 类型:

typedef struct ProcArray {                                                                                                                                                                    
    ProcInfo *array;
    size_t used;
    size_t size;
} ProcArray;

结果是一个seg错误,我认为这是因为memSize可能是一个长字符arr,例如:122313131(它是一个char[],因为它最初包含一个“kB”,我取出了“kB” ' 用于比较)或 ' '。

一些 memSize 值最初也不存在,因此我通过将它们的 char[] 设置为“”进行补偿,因此检查上面的该字符。

我只是使用了 qsort 错误吗?或者如果没有找到错误的值,我将 char[] 设置为“ ”的方法是什么?

如果需要更多代码,我将非常乐意提供!

c
1个回答
1
投票

a
不是
ProcInfo
的数组,它是单个
ProcArray
结构。需要排序的数组是
a.array

qsort(a.array, a.used, sizeof(ProcInfo), compareByMemSize);

传递

&
时不需要
a.array
,因为它已经是一个指针了。

© www.soinside.com 2019 - 2024. All rights reserved.