运行以下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
相关产品推荐
相关产品推荐

