C语言动态char数组创建问题:长度始终为0,求错误排查
动态char数组长度始终为0的问题排查
核心错误点:
strlen无法正确计算长度:strlen依赖字符串末尾的'\0'终止符统计长度,但你分配的数组全是未初始化的垃圾值,没有添加终止符,导致strlen返回结果未定义(大概率显示0)。- 输入循环条件逻辑错误:当前循环条件
while (letra > 'A' && letra < 'z')既会包含A到z之间的非字母字符(比如[、\),又会在输入'A'或'z'时直接终止循环,不符合“接收字母直到输入非字母”的需求。 - 数组元素访问语法错误:
cargar_letras函数里的(*(arreglo[cant_letras - 1])) = letra;逻辑错误,二级指针arreglo的下标访问方式不对,正确的数组元素访问应该先解引用得到数组指针,再取下标。 - 内存分配未预留终止符空间:如果要将数组作为字符串使用,分配的内存需要多留1个字节给
'\0',否则无法被字符串函数正确识别。
修正后的关键代码:
- 修正输入循环逻辑:
do { printf("ingrese letras: "); scanf(" %c", &letra); // 仅处理字母输入 if ((letra >= 'A' && letra <= 'Z') || (letra >= 'a' && letra <= 'z')) { cant_letras++; estado = pedir_memoria(&arreglo, cant_letras); if(estado != ERROR) printf("memoria solicitada correctamente \n"); estado = cargar_letras(letra, &arreglo, cant_letras); } } while ((letra >= 'A' && letra <= 'Z') || (letra >= 'a' && letra <= 'z'));
- 修正内存分配函数(预留终止符空间):
int pedir_memoria(char **arreglo, int cant_letras) { int estado = ERROR; char *aux = NULL; if (arreglo != NULL && cant_letras != 0) { // 分配cant_letras+1字节,预留'\0'位置 if(cant_letras == 1) { (*arreglo) = (char*)malloc(sizeof(char) * (cant_letras + 1)); if (*arreglo != NULL) estado = OK; } else { aux = (char*)realloc(*arreglo, sizeof(char) * (cant_letras + 1)); if(aux != NULL) { *arreglo = aux; estado = OK; } } } return estado; }
- 修正元素访问逻辑并添加终止符:
int cargar_letras(char letra, char** arreglo, int cant_letras) { int estado = ERROR; if(arreglo != NULL && *arreglo != NULL && cant_letras != 0) { // 正确访问数组元素:先解引用得到数组指针,再取下标 (*arreglo)[cant_letras - 1] = letra; // 添加终止符,确保strlen能正确计算长度 (*arreglo)[cant_letras] = '\0'; estado = OK; } return estado; }
- 补充内存释放:
// 现在strlen可以正确计算长度 largo = strlen(arreglo); printf("arr length: %d \n", largo); // 记得释放动态分配的内存 free(arreglo);
额外提醒:
- 每次分配/重分配内存后必须检查是否成功,避免空指针访问。
- 可以添加
scanf的返回值检查,处理输入失败的情况。
内容的提问来源于stack exchange,提问作者elmarti
相关产品推荐
相关产品推荐

