使用malloc定义字符串地址后代码无输出,无法写入文件及打印大写内容
问题分析与修复方案
核心问题拆解
原字符串指针被覆盖
你先定义char *str = "this is an example";指向常量字符串,但紧接着用str = (char *)malloc(...)让str指向了一块未初始化的动态内存,原字符串的指针直接丢失。后续strlen(str)读取的是未初始化内存的长度,结果不确定(大概率为0,导致循环完全不执行)。文件指针未正确初始化
fopen("4.txt", "w");调用后没有将返回的文件指针赋值给fP,导致fP是未初始化的野指针。用野指针调用fprintf会触发未定义行为,必然执行失败。潜在内存泄漏
malloc分配的动态内存没有用free释放,虽然不是当前无输出的直接原因,但会造成内存泄漏。
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> int main(int argc, const char * argv[]) { // 直接赋值文件指针,并检查打开是否成功 FILE *fP = fopen("4.txt", "w"); if (fP == NULL) { perror("Failed to open file"); return 1; } // 保留原字符串指针,避免被覆盖 const char *original_str = "this is an example"; // 如果需要用动态内存存储字符串,可取消下面注释 // char *str = malloc(sizeof(char) * 100); // if (str == NULL) { perror("malloc failed"); fclose(fP); return 1; } // strcpy(str, original_str); size_t length = strlen(original_str); for (size_t i = 0; i < length; i++) { // 转unsigned char避免toupper处理负char值的未定义行为 char upper_char = toupper((unsigned char)original_str[i]); fprintf(fP, "%c", upper_char); printf("%c", upper_char); } fclose(fP); // 关闭文件,确保内容写入磁盘 // 如果用了malloc,添加free(str); return 0; }
关键修复说明
- 保留原字符串:将原字符串存在独立的
const char*变量中,避免被动态内存指针覆盖;若确实需要动态内存,必须用strcpy把原字符串复制到malloc分配的内存里。 - 文件操作安全:
fopen的返回值必须赋值给fP,同时增加打开失败的判断(比如权限不足、路径不存在等情况)。 - toupper参数处理:
toupper要求输入为unsigned char或EOF,强制转换可避免某些编码下负char值导致的未定义行为。 - 关闭文件:
fclose会刷新文件缓冲区,确保内容真正写入磁盘,不关闭可能导致文件内容为空。
内容的提问来源于stack exchange,提问作者ben
相关产品推荐
相关产品推荐

