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

C语言实现存储最大长度40字符串的动态增长数组问题求助

问题排查与修正方案

你的代码存在以下核心错误:

  • 结构体成员定义错误:char *array[][40]是不完整的二维灵活数组类型,不符合需求。你需要的是指向长度为40的char数组的指针,即char (*array)[40],每一个array[i]就是一个可以存储最大39个有效字符+结束符的字符串空间。
  • 内存分配大小计算错误:malloc(initialSize * sizeof(char))只分配了initialSize个字节的空间,远不够存储多个长度为40的字符串,需要改为分配initialSize * sizeof(char[40])的空间。
  • 函数参数类型不匹配:insertArray的element参数定义为char类型,但你传入的是char[40]数组(退化为char*指针),类型完全不符,应该改为const char* element。
  • strcpy调用存在安全风险:没有限制拷贝长度,一旦传入的字符串超过40字节会发生越界,建议使用strncpy并手动补结束符。

修正后可运行完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
  char (*array)[40]; // 指向长度为40的char数组的指针,每个元素存一个最大长度40的字符串
  size_t used;
  size_t size;
} Array;

void initArray(Array *a, size_t initialSize) {
  // 分配initialSize个长度为40的char数组的空间
  a->array = malloc(initialSize * sizeof(*a->array));
  // 内存分配失败判断,避免空指针访问
  if (a->array == NULL) {
    perror("malloc failed");
    exit(EXIT_FAILURE);
  }
  a->used = 0;
  a->size = initialSize;
}

void insertArray(Array *a, const char* element) {
  if (a->used == a->size) {
    a->size *= 2;
    a->array = realloc(a->array, a->size * sizeof(*a->array));
    if (a->array == NULL) {
      perror("realloc failed");
      exit(EXIT_FAILURE);
    }
  }
  // 最多拷贝39个字符,留1位存结束符,避免越界
  strncpy(a->array[a->used], element, 39);
  a->array[a->used][39] = '\0'; // 强制补结束符,防止输入字符串超过39个字符时无结束符
  a->used++;
}

void freeArray(Array *a) {
  free(a->array);
  a->array = NULL;
  a->used = a->size = 0;
}

// 测试调用示例
int main() {
  Array a;
  char srcname[40] = "test demo string";
  initArray(&a, 100); 
  insertArray(&a, srcname);
  // 验证插入结果
  printf("插入的字符串:%s\n", a.array[0]);
  freeArray(&a);
  return 0;
}

内容的提问来源于stack exchange,提问作者arissalon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:06:05