C语言实现存储字符串的ArrayList出现赋值类型转换错误如何解决?
错误原因
- 结构体中
items成员的类型定义错误:你要存储字符串元素,每个元素是char*类型的指针,但当前你把items定义为char*,意味着items指向的是单个字符组成的数组,items[下标]的类型是char(本质是整型)。 - 赋值时类型不匹配:
add函数中你尝试把char*类型的字符串指针s,赋值给char类型的list->items[list->length],编译器因此触发「将指针转换为整数未做强制类型转换」的报错。 - 内存分配单位错误:初始化和扩容时你用
sizeof(char)作为单位分配内存,仅能分配到字符数量对应的字节数,完全不足以存储字符串指针所需的空间。
修复方案
需要修改类型定义、内存分配逻辑的单位,若需要存储字符串的独立副本(避免原字符串被释放后列表出现野指针),还要补充字符串拷贝逻辑:
修改后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct ArrayList { int length; int capacity; // 修改为char**,指向字符串指针数组 char **items; } ArrayList; ArrayList *newList() { // 分配内存的单位改为sizeof(char*),对应每个字符串指针的大小 char **items = malloc(4 * sizeof(char*)); ArrayList *list = malloc(sizeof(ArrayList)); list->length = 0; list->capacity = 4; list->items = items; return list; } // 检查并按需扩容列表 void check(ArrayList *list) { if (list->length >= list->capacity) { list->capacity = list->capacity * 2; // 扩容单位同样改为sizeof(char*) list->items = realloc(list->items, list->capacity * sizeof(char*)); if (list->items == NULL) { exit(1); } } } void add(ArrayList *list, char *s) { check(list); // 如果仅需要存储原字符串的指针,直接赋值即可:list->items[list->length] = s; // 如果需要存储字符串的独立副本,用strdup(内部会自动申请内存拷贝字符串) list->items[list->length] = strdup(s); list->length++; } // 补充销毁列表的函数,避免内存泄漏 void freeList(ArrayList *list) { for (int i = 0; i < list->length; i++) { // 先释放每个字符串的内存 free(list->items[i]); } // 释放指针数组 free(list->items); // 释放结构体本身 free(list); }
内容的提问来源于stack exchange,提问作者Gabby Han
相关产品推荐
相关产品推荐

