C语言如何通过指针跨函数传递并访问字符串数组的值
问题分析
- 局部栈内存不可返回:你代码里的
buffer、array都是getName函数的栈上局部变量,函数退出后栈空间会被系统回收,你返回的指向这些空间的指针都是野指针,访问会触发未定义行为。 - 返回值不匹配需求:你当前返回的是
*array,也就是仅返回了第一个字符串的指针,根本无法传递整个数组的两个元素。 - 主函数访问逻辑错误:你把
char*类型的p当成字符串数组用,p[i]实际是单个字符,用%s打印必然报错。
修复方案(调用方传参实现,无内存泄漏风险)
我们让主函数提前分配好存储拆分结果的指针数组、以及存储原始字符串拷贝的缓冲区,作为参数传入getName,避免返回栈内存的问题:
首先是修改后的getName函数:
// 参数说明: // complete_name: 输入的完整姓名 // out_buffer: 调用方传入的缓冲区,用来存原始字符串的拷贝,避免栈内存释放问题 // out_name_arr: 调用方传入的char*数组,长度至少为2,用来存拆分后的姓、名指针 // 返回值:0表示拆分成功,-1表示拆分失败 int getName(const char *complete_name, char *out_buffer, char **out_name_arr) { strcpy(out_buffer, complete_name); int i = 0; char *p = strtok(out_buffer, ","); while (p != NULL && i < 2) { out_name_arr[i++] = p; p = strtok(NULL, ","); } // 校验是否拆分得到2个元素 return i == 2 ? 0 : -1; }
然后是修改后的主函数:
int main() { const char *patient = "Doe,John"; char buffer[50]; // 提前分配缓冲区 char *name_arr[2]; // 提前分配存储姓名指针的数组 int i, ret; ret = getName(patient, buffer, name_arr); if (ret != 0) { printf("姓名格式错误,拆分失败\n"); return -1; } for (i = 0; i < 2; i++ ) { printf("%s\n", name_arr[i]); } return 0; }
注意:实际使用时建议增加缓冲区长度参数传入,避免strcpy溢出风险
其他可选方案
你也可以在getName内用malloc分配堆内存来存储缓冲区和指针数组,但是要注意用完后需要调用free释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

