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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:54:06