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

C语言中从函数返回字符串指针并赋值给主函数变量的问题

问题分析与修正方案

你的代码存在几个关键问题,导致字符串处理出错,下面逐一说明并给出修复后的代码:

核心错误点

  • 返回类型不匹配:getIdentity函数返回的是字符数组的地址,却声明为int类型,应该改为char*;主函数里的placeholder是int*,同样要改为char*才能正确接收字符串指针。
  • 数组大小不足:static char userin[] = "";只分配了1个字节的空间(仅存字符串结束符'\0'),输入任何ID都会导致缓冲区溢出,需要指定足够的大小(比如和主函数的userID一致的10字节)。
  • 数组赋值错误:C语言中数组名是常量指针,不能直接用=赋值,必须用字符串复制函数(如strcpy或更安全的strncpy)来拷贝内容。
  • 输入无长度限制:scanf("%s", userin)不限制输入长度,容易触发缓冲区溢出,要限定输入的最大字符数。

修复后的代码

#include <stdio.h>
#include <string.h> // 引入strcpy所需的头文件

char* getIdentity() {
    static char userin[10] = ""; // 指定足够大小的静态数组
    printf("What is your ID? ");
    scanf("%9s", userin); // 限制输入为9个字符,留1个位置给'\0'
    return userin; // 直接返回数组名(数组名本身就是首元素地址)
}

int main(void) {
    char* placeholder;
    char userID[10] = "";

    placeholder = getIdentity();
    strcpy(userID, placeholder); // 使用strcpy复制字符串到userID数组
    printf("Your ID is: %s\n", userID); // 验证结果
    return 0;
}

额外说明

  • 使用static修饰userin是正确的,因为静态变量的生命周期贯穿整个程序,返回它的地址不会导致悬空指针问题。
  • 如果追求更高安全性,推荐用strncpy(userID, placeholder, sizeof(userID)-1),并手动添加userID[sizeof(userID)-1] = '\0';,避免目标数组溢出。

内容的提问来源于stack exchange,提问作者Thomas DeLise

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:55:10