【问题标题】:C generic array implementationC 泛型数组实现
【发布时间】:2016-05-28 07:11:53
【问题描述】:

我正在尝试在 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;
}

【问题讨论】:

  • sizeof(listptr-&gt;elementSize)?真的吗?
  • malloc() 返回一个指针,你为什么要分配一个指向listptr的指针?
  • @n.m.感谢您修复代码!
  • 建议数组元素必须包含void* 的实际数据。然后使用该列表的程序可以以适合应用程序的方式解释数据。

标签: c arrays list generics


【解决方案1】:

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

@n.m. 首先注意到,您确实想使用listptr-&gt;elementSize 而不是sizeof(listptr-&gt;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

【讨论】:

  • 感谢您的纠正。我删除了 sizeof(),它现在适用于 double,但字符串类型 (char *) 仍然不起作用,它一直在打印奇怪的符号
  • 注意,如果你只存储指向字符串的指针,你必须确保数组在使用前没有被破坏(这称为悬空指针,google一下...)
  • 圣人,你是我的上帝!你直接指出问题!我将 free() 放在数组列表驱动程序的一部分中,这就是导致问题的原因。我删除它,现在一切正常。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多