C语言返回字符串异常:产品码生成函数返回后输出错误咨询
解决局部数组返回后输出异常的问题
你这段代码的问题核心是局部数组pcode的生命周期:pcode是generate函数里的局部变量,存在于栈内存中。当函数执行完返回时,这块栈内存会被系统回收,后续main函数再访问这个地址的内容,就会触发未定义行为——这就是为什么函数内部打印正常,但main里输出异常的原因。
下面给你三种可行的解决办法:
1. 动态分配堆内存
用malloc在堆上分配内存,堆内存不会随函数返回释放,不过记得用完要调用free释放,避免内存泄漏。
#include <stdlib.h> char* generate(int num) { // 分配3字节空间存储产品码 char* pcode = malloc(3 * sizeof(char)); if (pcode == NULL) { // 处理内存分配失败的情况,比如返回NULL return NULL; } // 这里写生成产品码的逻辑,示例生成"12a" pcode[0] = '1'; pcode[1] = '2'; pcode[2] = 'a'; printf("%s\n", pcode); return pcode; } int main(void) { char* code = generate(12); if (code != NULL) { printf("%s\n", code); free(code); // 必须释放动态分配的内存 } return 0; }
2. 由调用者提供缓冲区
让main函数提前准备好数组,传递给generate函数写入内容,内存的生命周期由调用者控制,不用操心内存泄漏。
void generate(int num, char* pcode) { // 直接把生成的产品码写入传入的缓冲区 pcode[0] = '1'; pcode[1] = '2'; pcode[2] = 'a'; printf("%s\n", pcode); } int main(void) { char code[3]; generate(12, code); printf("%s\n", code); return 0; }
3. 使用静态数组(谨慎使用)
把pcode定义为静态变量,这样数组会存在静态内存区,函数返回后不会被回收。但要注意,静态数组是全局共享的,多次调用generate的话,新生成的产品码会覆盖之前的结果,不适合需要保留多份结果的场景。
char* generate(int num) { static char pcode[3]; // 生成产品码的逻辑 pcode[0] = '1'; pcode[1] = '2'; pcode[2] = 'a'; printf("%s\n", pcode); return pcode; } int main(void) { printf("%s\n", generate(12)); return 0; }
内容的提问来源于stack exchange,提问作者nawab
相关产品推荐
相关产品推荐

