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; }
额外注意点
- 原代码未处理
strsSize=0的边界情况,LeetCode测试用例可能包含该场景,需补充判断。 - C语言字符串必须以
'\0'结尾,堆分配的数组一定要手动添加结束符,否则打印或使用字符串时会越界读取,引发未定义行为。 malloc可能返回NULL(内存不足时),虽LeetCode环境极少出现,但补充判断更严谨。
内容的提问来源于stack exchange,提问作者Confused Coder
相关产品推荐
相关产品推荐

