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

编写接收星期枚举变量并返回对应名称字符串指针的函数

嘿,我瞅见你写的这段代码啦,这里有个核心问题得修正,咱们先唠唠问题出在哪,再给你几个靠谱的解决办法~

你的代码里的致命问题

在week函数里,你定义了char date[20];——这是个局部自动变量,它存在于函数的栈帧里。当week函数执行完返回时,这块栈内存会被操作系统回收,你返回的指针就变成了「悬空指针」,指向的是已经无效的内存。后续用这个指针去打印内容,程序可能输出乱码、崩溃,或者出现其他不可预料的行为(这在C里叫「未定义行为」)。

另外还有两个小细节不符合C标准:

  • void main()不是标准的主函数写法,标准要求主函数返回int类型,并且要返回0表示程序正常结束;
  • 函数声明char *week(enum DAY x);放在了枚举定义之前,编译器会不知道enum DAY是什么类型,编译会报错。

修正方案:三种可选的正确写法

方案1:返回字符串字面量(最推荐,简单安全)

字符串字面量(比如"Monday")是存储在程序的只读数据段里的,生命周期和整个程序一致,所以直接返回它们的指针完全没问题。代码也能简化不少:

#include <stdio.h>

// 先定义枚举,再声明函数,避免编译报错
enum DAY {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
char *week(enum DAY x);

int main() {
    char *date = week(Monday);
    printf("%s", date);
    return 0;
}

char *week(enum DAY x) {
    switch (x) {
        case Monday: return "Monday";
        case Tuesday: return "Tuesday";
        case Wednesday: return "Wednesday";
        case Thursday: return "Thursday";
        case Friday: return "Friday";
        case Saturday: return "Saturday";
        case Sunday: return "Sunday";
        default: return "Invalid day";  // 加个默认分支处理非法输入更健壮
    }
}

注意:字符串字面量是只读的,如果你尝试修改返回的字符串(比如*date = 'm'),会触发未定义行为,所以如果不需要修改字符串,这个方案是最优解。

方案2:使用静态局部变量

把date改成静态局部变量,它会存储在全局数据段,函数返回后不会被销毁。但要注意,这种方式是线程不安全的——如果多个线程同时调用week,或者你保存了指针后再次调用week,之前的指针指向的内容会被覆盖:

#include <stdio.h>
#include <string.h>

enum DAY {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
char *week(enum DAY x);

int main() {
    char *date = week(Monday);
    printf("%s", date);
    return 0;
}

char *week(enum DAY x) {
    static char date[20];  // 静态变量,生命周期同程序
    switch (x) {
        case Monday: strcpy(date, "Monday"); break;
        case Tuesday: strcpy(date, "Tuesday"); break;
        case Wednesday: strcpy(date, "Wednesday"); break;
        case Thursday: strcpy(date, "Thursday"); break;
        case Friday: strcpy(date, "Friday"); break;
        case Saturday: strcpy(date, "Saturday"); break;
        case Sunday: strcpy(date, "Sunday"); break;
        default: strcpy(date, "Invalid day"); break;
    }
    return date;
}

方案3:让调用者提供缓冲区(最灵活安全,适合严谨场景)

由调用者负责分配内存,函数把星期名称复制到这个缓冲区里,这样完全不会有悬空指针的问题,也避免了线程安全隐患:

#include <stdio.h>
#include <string.h>

enum DAY {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
// 函数返回缓冲区指针(失败返回NULL)
char *week(enum DAY x, char *buffer, size_t buffer_size);

int main() {
    char date[20];
    if (week(Monday, date, sizeof(date)) != NULL) {
        printf("%s", date);
    } else {
        printf("Buffer too small or invalid day");
    }
    return 0;
}

char *week(enum DAY x, char *buffer, size_t buffer_size) {
    if (buffer == NULL || buffer_size == 0) {
        return NULL;
    }
    const char *day_name;
    switch (x) {
        case Monday: day_name = "Monday"; break;
        case Tuesday: day_name = "Tuesday"; break;
        case Wednesday: day_name = "Wednesday"; break;
        case Thursday: day_name = "Thursday"; break;
        case Friday: day_name = "Friday"; break;
        case Saturday: day_name = "Saturday"; break;
        case Sunday: day_name = "Sunday"; break;
        default: day_name = "Invalid day"; break;
    }
    // 检查缓冲区是否足够容纳字符串(包括结束符'\0')
    if (strlen(day_name) + 1 > buffer_size) {
        return NULL;
    }
    strcpy(buffer, day_name);
    return buffer;
}

这个方案的优势是内存由调用者掌控,你可以修改缓冲区里的内容,也不用担心线程安全问题,适合对稳定性要求高的场景。

内容的提问来源于stack exchange,提问作者Mohamed Moustafa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:53:01