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

运行以下C语言代码无输出、界面空白无内容,是什么原因导致的?

故障根因分析

如下为问题代码:

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

char* foo(){
    char temp[] = "World";
    char *result;
    strcpy(result, temp);
    return result;
}

int main(){
    printf("%s", foo());
    return 0;
}
  • 最核心的故障触发点是未初始化的野指针非法写入:代码中仅声明了char *result指针变量,没有为其分配任何合法的可写内存空间,其存储的地址值是随机的栈垃圾值。调用strcpy(result, temp)时,会尝试向这个随机地址写入字符串内容,属于C语言标准定义的未定义行为,几乎都会触发操作系统的内存保护机制,程序在foo函数执行阶段就会因段错误直接崩溃终止,根本不会执行到后续的printf语句,因此不会产生任何输出。
  • 额外补充:即使修正了野指针问题,如果将result直接指向栈上的temp数组后返回,同样会触发未定义行为:temp是foo函数内的栈局部变量,函数执行结束后栈空间会被系统回收,返回的地址指向已失效的内存区域,访问该地址的结果不可控。
参考修复方案

方案1:动态堆内存分配

需要调用方使用完后手动释放内存,避免内存泄漏:

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

char* foo(){
    char temp[] = "World";
    // 分配足够存储字符串的内存,+1是为了存放字符串结束符'\0'
    char *result = (char*)malloc(strlen(temp) + 1);
    if (result == NULL) {
        return NULL;
    }
    strcpy(result, temp);
    return result;
}

int main(){
    char *str = foo();
    if (str != NULL) {
        printf("%s", str);
        free(str); // 释放动态申请的堆内存
    }
    return 0;
}

方案2:静态存储区存储

不需要手动释放,但函数不可重入,多线程场景下需注意并发安全:

char* foo(){
    // static修饰的变量存储在全局静态存储区,函数退出后空间不会被回收
    static char result[] = "World";
    return result;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 15:48:03