C 泛型数组实现

Min*_*ing 6 c arrays generics list

我试图在 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;
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*sta 6

您的代码中存在一些小问题,但它可以正确处理双精度值。

首先由@nm 注意到,你真的想使用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;
}
Run Code Online (Sandbox Code Playgroud)

它按预期打印:

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;
}
Run Code Online (Sandbox Code Playgroud)