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

C语言函数返回空而非数组:LeetCode最长公共前缀求解问题

问题分析

你的核心问题是返回了栈上的局部数组:

  • char ret[len]; 是在函数栈帧上分配的局部数组,当longestCommonPrefix函数执行完毕返回时,栈帧会被销毁,这块内存会被操作系统回收或重新分配,此时返回的ret指针就变成了悬空指针,指向的内容不再有效,所以调用方拿到的是(null)或者乱码。
  • 你打印的时候函数还没退出,栈内存还没被回收,所以能看到正确结果。
修正方案

在C语言中,要返回能被调用方安全使用的字符串,需要用堆内存分配(比如malloc/calloc),用完后由调用方负责释放(LeetCode会自动处理内存释放,无需手动操作)。

修正后的代码如下:

char * longestCommonPrefix(char ** strs, int strsSize){
    // 处理空输入的边界情况
    if (strsSize == 0) return "";
    
    int minlen = strlen(strs[0]);
    for(int i=0; i<strsSize; i++){
        int len = strlen(strs[i]);
        if(len<minlen){
            minlen=len;
        }
    }

    int len=0;
    for(int i=0; i<minlen; i++){
        int match=1;
        char check = strs[0][i];
        for(int j=0; j<strsSize; j++){
            if(strs[j][i]!=check){
                match=0;
                break;
            }
        }
        if(match==0){
            break;
        }
        else{
            len++;
        }
    }

    if(len==0){
        return "";
    }
    
    // 使用malloc分配堆内存,多留一个字节存字符串结束符'\0'
    char *ret = (char*)malloc(len + 1);
    if (ret == NULL) return ""; // 处理内存分配失败的极端情况
    
    for(int i=0; i<len; i++){
        ret[i] = strs[0][i];
    }
    ret[len] = '\0'; // 必须添加字符串结束符,否则会出现未定义行为
    
    return ret;
}
额外注意点
  1. 原代码未处理strsSize=0的边界情况,LeetCode测试用例可能包含该场景,需补充判断。
  2. C语言字符串必须以'\0'结尾,堆分配的数组一定要手动添加结束符,否则打印或使用字符串时会越界读取,引发未定义行为。
  3. malloc可能返回NULL(内存不足时),虽LeetCode环境极少出现,但补充判断更严谨。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:58:30