c - 数组赋值改变第一个值

标签 c arrays

我想创建一个带有自定义元素的二叉堆,该堆使用 struct Elem 数组来存储数据。但是在插入之后,一些数据丢失了,在本例中是 key 值。

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

#define DEFAULT_CAPACITY    16
#define VALS 10

const int values[VALS] = {1, 2, 3, 4, 7, 8, 9, 10, 14, 16};

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

typedef struct Elem {
    void    *key;
    void    *value;
} Elem;

typedef struct Heap {
    unsigned int    size;
    unsigned int    capacity;
    Elem            **array;
    compareFunction compare;
} Heap;

Heap *hpCreate(compareFunction compare)
{
    Heap *heap;

    heap = (struct Heap *) malloc(sizeof(struct Heap));
    if (heap == NULL) return NULL;

    if ((heap->array = (struct Elem **) malloc(0)) == NULL) {
        free(heap);
        return NULL;
    }

    heap->size = 0;
    heap->capacity = DEFAULT_CAPACITY;
    heap->compare = compare;

    return heap;
}

Elem *hpCreateElem(void *key, void *value)
{
    Elem *el;

    el = (struct Elem *) malloc(sizeof(struct Elem));
    if (el == NULL) return NULL;

    el->key = key;
    el->value = value;

    return el;
}

void hpInsert(Heap *hp, void *key, void *value)
{
    Elem *el, *par;
    int pos;

    pos = hp->size++;
    el = hpCreateElem(key, value);
    par = hp->array[pos/2];

    while (pos > 1 && hp->compare(el->key, par->key) > 0) {
        hp->array[pos] = hp->array[pos/2];
        pos = pos/2;
        par = hp->array[pos/2];
    }

    hp->array[pos] = el;
}

int compare_int_ptr(const void *ptr1, const void *ptr2)
{
    int v1 = *((int *) ptr1); 
    int v2 = *((int *) ptr2);

    if (v1 == v2)
        return 0;
    else
        return (v1 > v2) ? 1 : -1;
}

int main()
{
    Heap *hp;
    Elem *el;
    int i;

    hp = hpCreate(compare_int_ptr);

    for (i = 0; i < VALS; i++) {
        hpInsert(hp, (void *) &values[i], (void *) &values[i]);
    }

    for (i = 0; i < VALS; i++) {
        el = hp->array[i];
        printf("%d\n", *((int *) el->key));
    }

    return 0;
}

产生的输出是

4196700
16
14
9
10
4
3
8
17231984
7

而不是二叉堆数组正确排序为 16 9 14 7 4 8 10 3 2 1

最佳答案

因为您告诉容器您分配了 DEFAULT_CAPACITY 元素:

heap->capacity = DEFAULT_CAPACITY;

然后:

malloc(0)

应该是

malloc(DEFAULT_CAPACITY * sizeof(Elem*))

行:

par = hp->array[pos/2];

正在读取未初始化的对象。

关于c - 数组赋值改变第一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38037480/

相关文章:

c - 闰年 - 仅使用 C 中的算术运算符

计算字符中的位并计算位

java - 矩阵中的最大值

php - PHP中的动态数组遍历

java - 在java中查找n个数组之间的公共(public)元素之和

javascript - 如何将 JSON 数组转换为 Javascript 数组?

c++ - 这些宏和 typedef 有什么作用?如何将其扩展为成员函数?

c - C与其抽象机之间的确切关系是什么?

c - 读取结构大小时出现问题

JavaScript 取消移动每个数组元素