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

LeetCode运行报char空间不足/堆溢出,本地VSC正常求助

最长公共前缀函数LeetCode运行报错问题

报错信息

Line 15: Char 28: runtime error: store to address 0x602000000070 with insufficient space for an object of type 'char' [solution.c]
0x602000000070: note: pointer points here
 01 00 80 67  be 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00
              ^

问题代码

char * longestCommonPrefix(char ** strs, int strsSize)
{
    int z = 0;
    int i = 0;
    char* outputa = malloc(sizeof *outputa * z);
    for (i = 0; i < *strs[i]; i++)
    {
        for (z = 0; z < *strs[i*z]; z++)
        {
            if (strs[i+1][z] == strs[i][z] && strs[i+2][z] == strs[i][z])
            {
                outputa[z] = strs[i][z];
                continue;
            }
            break;
        }
        break;
    }
    return outputa;
}

已尝试的解决方法

  • 改用while循环检查strs[i][z] != '0',触发heap buffer overflow错误
  • 调整malloc写法,仍出现堆溢出或char类型空间不足错误

问题分析与解决方案

原代码核心问题

  1. 内存分配错误:初始化时z=0,malloc(sizeof *outputa * z)分配了0字节空间,后续写入outputa[z]必然越界
  2. 循环条件逻辑混乱:
    • i < *strs[i] 中*strs[i]是取strs[i]首字符的ASCII值,不是字符串长度,循环条件完全错误
    • z < *strs[i*z] 中i*z的索引计算会导致数组越界,逻辑不成立
  3. 比较逻辑不完整:仅比较了strs[i]、strs[i+1]、strs[i+2],未处理strsSize<3的情况;且外层循环执行一次就break,无法遍历所有字符

正确实现代码

char * longestCommonPrefix(char ** strs, int strsSize) {
    // 处理空输入
    if (strsSize == 0) {
        char *empty = malloc(1);
        empty[0] = '\0';
        return empty;
    }
    
    // 以第一个字符串为基准,获取初始前缀长度
    int prefix_len = strlen(strs[0]);
    
    // 遍历其余所有字符串,逐步缩短公共前缀长度
    for (int i = 1; i < strsSize; i++) {
        int j = 0;
        // 逐个字符比较,找到当前字符串与基准的公共前缀长度
        while (j < prefix_len && j < strlen(strs[i]) && strs[0][j] == strs[i][j]) {
            j++;
        }
        prefix_len = j;
        // 公共前缀为空,提前终止循环
        if (prefix_len == 0) {
            break;
        }
    }
    
    // 分配内存存储结果(需额外1字节存字符串终止符'\0')
    char *result = malloc(sizeof(char) * (prefix_len + 1));
    if (result == NULL) {
        return NULL;
    }
    // 复制公共前缀并添加终止符
    strncpy(result, strs[0], prefix_len);
    result[prefix_len] = '\0';
    
    return result;
}

代码说明

  • 先处理空输入的边界情况,避免后续访问空指针
  • 以第一个字符串为基准,遍历其余字符串,逐个字符比较,动态更新公共前缀的长度
  • 最终分配足够的内存(公共前缀长度+1),确保能存储字符串终止符,避免越界
  • 提前终止条件:当公共前缀长度为0时,直接跳出循环,提升效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:18:24