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

C语言中函数返回字符数组至变量的问题咨询与求解

问题原因与修复方案:从函数返回字符串到main函数

问题原因

  • 返回值类型不匹配:你定义get_name返回char类型,return *name实际上是返回字符串首字符的值,而非首地址,所以main函数只能接收到单个字符。
  • 局部数组生命周期问题:就算你试图返回name(数组首地址),char name[100]是函数内的局部变量,函数执行完毕后,该数组占用的栈内存会被系统回收,返回其地址会导致野指针,后续访问属于未定义行为。
  • 数组初始化错误:char name[100] = {get_name("Name: ")};这种初始化方式只会给数组的第一个元素赋值,其余元素会被默认初始化为'\0',所以数组中只有首字符有效,后续都是空字符。

修复方法

方法1:调用者提供缓冲区(推荐)

让main函数提前分配好缓冲区,传递给get_name函数直接写入,避免内存管理问题:

#include <stdio.h>

void get_name(char prompt[], char buffer[], size_t buffer_size)
{
    printf("%s", prompt);
    // 限制输入长度,防止缓冲区溢出
    scanf("%*s", buffer_size - 1, buffer);
    // 确保字符串以'\0'结尾
    buffer[buffer_size - 1] = '\0';
}

int main(void)
{
    char name[100];
    get_name("Name: ", name, sizeof(name));
    printf("%s\n", name);
    return 0;
}

方法2:动态内存分配

在get_name中用malloc分配内存,返回指针,注意main函数使用后必须手动释放内存:

#include <stdio.h>
#include <stdlib.h>

char* get_name(char prompt[])
{
    printf("%s", prompt);
    // 分配100字节内存,可根据需求调整
    char* name = malloc(100 * sizeof(char));
    if (name == NULL) {
        perror("malloc failed");
        return NULL;
    }
    scanf("%99s", name);
    name[99] = '\0';
    return name;
}

int main(void)
{
    char* name = get_name("Name: ");
    if (name != NULL) {
        printf("%s\n", name);
        free(name); // 必须释放动态内存,避免泄漏
    }
    return 0;
}

方法3:使用静态数组(不推荐)

将函数内的局部数组改为static,使其生命周期延长至程序结束,但静态数组是全局共享的,多线程环境下不安全,多次调用会覆盖之前的内容:

#include <stdio.h>

char* get_name(char prompt[])
{
    printf("%s", prompt);
    static char name[100];
    scanf("%99s", name);
    name[99] = '\0';
    return name;
}

int main(void)
{
    char* name = get_name("Name: ");
    printf("%s\n", name);
    return 0;
}

内容的提问来源于stack exchange,提问作者Noori Muhammed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:35:16