You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现存储字符串的ArrayList出现赋值类型转换错误如何解决?

错误原因
  1. 结构体中items成员的类型定义错误:你要存储字符串元素,每个元素是char*类型的指针,但当前你把items定义为char*,意味着items指向的是单个字符组成的数组,items[下标]的类型是char(本质是整型)。
  2. 赋值时类型不匹配:add函数中你尝试把char*类型的字符串指针s,赋值给char类型的list->items[list->length],编译器因此触发「将指针转换为整数未做强制类型转换」的报错。
  3. 内存分配单位错误:初始化和扩容时你用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:45:03