c - 为什么 qsort 中的排序方法改变了我的数组?

标签 c qsort

https://phoxis.org/2012/07/12/get-sorted-index-orderting-of-an-array/

我尝试了该部分下的方法

在 C 中使用 qsort

对数组进行排序并返回索引,将数组 base_arr 更改为 double* 类型。但是,当我将 arr[idx[i]] 打印到屏幕上时,一半的值已更改为 0,并且已排序,就好像它们始终为 0 一样。什么可能导致这种情况发生?

double *BASE_ARR;
int main(int argc, char *argv[]) {

int N = par->N;
int K = par->K;
double *ptr;
ptr = (double *) malloc(N*sizeof(ptr)); 

int *idx;
idx = (int *) malloc(N*sizeof(idx));

// generate the array to be sorted (ptr), in a separate file

for (int i = 0; i < N; i++) {
    idx[i] = i;
}

BASE_ARR = ptr; 
// sort
qsort(idx, N, sizeof(idx), idxSort);


for (int i = 0; i < N; i++) {
    printf("%f\n",ptr[idx[i]]);
}
for (int i = 0; i < N; i++) {
    printf("%d\n",idx[i]);
}

for (int i = 0; i < K; i++) {
    idx[i] = -1;
}


return 0;
}

static int idxSort (const void *a, const void *b) {
int aa = *((int *)a), bb = *((int *)b);

if (BASE_ARR[aa] < BASE_ARR[bb]) {
    return -1;
}
if (BASE_ARR[aa] == BASE_ARR[bb]) {
    printf("what");tack
    return 0;
}
if (BASE_ARR[aa] > BASE_ARR[bb]) {
    return 1;
}

}

最佳答案

qsort(idx, N, sizeof(idx), idxSort);

应该是

qsort(idx, N, sizeof(*idx), idxSort);

idx 是一个指针。 qsort 不需要知道指针的大小;它需要知道数组元素的大小。

与您的 malloc 调用相同。您需要在其中使用 sizeof(*idx)sizeof(*ptr) 。顺便说一下,不要强制转换 malloc 的结果。

关于c - 为什么 qsort 中的排序方法改变了我的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39938358/

相关文章:

c - C 中的 qsort(动态分配)

c - 如何使用来自 bool 语句的 true 或 false 数据?

c - 在句子(具有多个单词)中查找多单词字符串(关键字)的优化算法或方法?

c - 我们如何知道一个 bzip2 block 的未压缩数据的大小?

c - qsort()不适用于数字数组

C:使用 qsort 对二维数组进行逐行排序

c++ - 使用 qsort() 时写入访问冲突

c++ - 如何在 c 中使用 qsort 比较 C++ 字符串?

c - 将新值插入C中的堆栈中

c - 移植代码 : is there any API equivalent to utssys() in Linux? 我需要将 utssys() unix API 移植到 Linux 环境吗?