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

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',否则无法被字符串函数正确识别。

修正后的关键代码:

  1. 修正输入循环逻辑:
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'));
  1. 修正内存分配函数(预留终止符空间):
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;
}
  1. 修正元素访问逻辑并添加终止符:
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;
}
  1. 补充内存释放:
// 现在strlen可以正确计算长度
largo = strlen(arreglo);
printf("arr length: %d \n", largo);

// 记得释放动态分配的内存
free(arreglo);

额外提醒:

  • 每次分配/重分配内存后必须检查是否成功,避免空指针访问。
  • 可以添加scanf的返回值检查,处理输入失败的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:18:24