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
相关产品推荐
相关产品推荐

