我正在尝试在 C 中实现通用数组列表。但是,当数据类型是 int 以外的任何类型时,列表将不会包含正确的数据。例如,像 123.1234 作为双精度数,当将双精度数传递到列表中时,它将变成 000.0000。一、当数据类型为int时,它将有正确的值。我不知道哪部分代码是错误的,有人可以给我提示吗?谢谢
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "genericADT.h"
struct list_type {
void *data;
int elementSize;
int size;
int capacity;
};
ListType create(int elementSize) {
ListType listptr = malloc(sizeof(struct list_type));
if (listptr != NULL) {
listptr->size = 0;
listptr->capacity = 10;
listptr->elementSize = elementSize;
listptr->data = malloc(10 * (listptr->elementSize));
if (listptr->data == NULL) {
free(listptr);
listptr = NULL;
}
}
return listptr;
}
void push(ListType listptr, void *item) {
if (listptr->size >= listptr->capacity) {
void *temp = realloc(listptr->data, listptr->elementSize * (listptr->capacity + 100));
if (temp != NULL) {
listptr->capacity += 100;
listptr->data = temp;
memcpy(listptr->data + (listptr->size) * (listptr->elementSize), item, sizeof(listptr->elementSize));
listptr->size++;
}
} else {
memcpy(listptr->data + (listptr->size) * (listptr->elementSize), item, sizeof(listptr->elementSize));
listptr->size++;
}
}
void *get(ListType listptr, int index) {
return listptr->data + index * (listptr->elementSize);
}
int size_is(ListType listptr) {
return listptr->size;
}
您的代码中存在一些小问题,但它可以正确处理双精度值。
首先,正如 @n.m. 注意到的,你真的想使用listptr->elementSize
代替sizeof(listptr->elementSize)
接下来,当您想要进行指针算术时,您应该将数据声明为char *
并不是void *
最后作为基本优化,您在容量测试后提取实际的插入代码,而不是在两个分支中复制它。
但在这些修复之后,这个 main 正确地存储和提取双精度:
int main() {
ListType ls = create(sizeof(double));
double f1=1.5, f2=3.6;
push(ls, &f1);
push(ls, &f2);
printf("Got %f %f\n", *((double *) get(ls, 0)), *((double *) get(ls, 1)));
return 0;
}
它按预期打印:
Got 1.500000 3.600000
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)