分配和排序指向现有结构的指针数组

时间:2017-02-02 18:17:38

标签: c arrays pointers struct

我有一系列预分配的结构。我试图构造一个使用该数组作为输入的函数,以便我可以构造一个指向预分配的struct数组的指针数组。然后我想使用qsort对指针数组进行排序,但我似乎误解了指针是如何传递的,因为当我尝试运行我的代码时,它是一个违反内存访问的雷区。

第一个问题似乎与行:  (&(pRet->ppIndexArray))[i] = &pTestElement[i]; 在sortedIndexPointer中,我的想法是ppIndexArray是一个指针数组的指针,我需要获取ppIndexArray指向的数组的地址,然后将当前TestElement的地址写入,但这似乎不对。

请参阅下面的简化代码:

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

typedef int(*CompareFunction)(const void *, const void *);

typedef struct TestElement
{
    const char *pName;
    double data;
} TestElement;

typedef struct TestElementIndex
{
    unsigned elementCount;
    TestElement **ppIndexArray;
} TestElementIndex;

int CompareNumbers(const void *p1, const void *p2) {
    TestElement *pTest1 = *(TestElement **)p1;
    TestElement *pTest2 = *(TestElement **)p2;
    if (pTest1->data > pTest2->data) {
        return 1;
    }
    else if (pTest1->data < pTest2->data) {
        return -1;
    }
    else {
        return 0;
    }
}

TestElementIndex *sortedIndexPointer(TestElement *pTestElement, const unsigned Count,
                                     CompareFunction comparer) {
    TestElementIndex *pRet = malloc(sizeof(TestElementIndex));
    pRet->elementCount = Count;
    pRet->ppIndexArray = malloc(sizeof(TestElement *)*Count);

    for (unsigned i = 0; i < Count; i++) {
        (&(pRet->ppIndexArray))[i] = &pTestElement[i];
    }

    if (comparer) {
        qsort(pRet->ppIndexArray, sizeof(TestElement *), Count, comparer);
    }
    return pRet;
}

void DisplayElements(const TestElementIndex *pTestElementIndex) {
    for (unsigned i = 0; i < pTestElementIndex->elementCount; i++) {
        printf("%lf\n",
            pTestElementIndex->ppIndexArray[i]->data);
    }
}

int main() {
    TestElement arr[] = {
        { "Test1", 5 },
        { "Test2", 8 },
        { "Test3", 4 },
        { "Test4", 9 },
        { "Test5", 1 },
        { "Test6", 2 },
        { "Test7", 0 },
        { "Test8", 7 },
        { "Test9", 3 },
        { "Test10", 6 }
    };
    unsigned Count = sizeof(arr) / sizeof(arr[0]);
    TestElementIndex *pSorted = sortedIndexPointer(arr, Count, CompareNumbers);
    DisplayElements(pSorted);
}

1 个答案:

答案 0 :(得分:1)

您的代码几乎没有问题:首先,qsort参数的顺序不同,您想调用

qsort(pRet->ppIndexArray, Count, sizeof(TestElement *), comparer);

qsort(pRet->ppIndexArray, sizeof(TestElement *), Count, comparer);

接下来,当填充索引数组时,你不想取(数据的地址)数组的地址,你想要数组本身,

for (unsigned i = 0; i < Count; i++) {
    pRet->ppIndexArray[i] = &pTestElement[i];
}

否则最合理,请检查http://cpp.sh/5mrxh