如何为作为参数传递的指针添加空终止符?函数崩溃求助
解决添加空终止符导致的程序崩溃问题
你的程序崩溃的核心原因是运算符优先级错误,这是C语言里很容易踩的坑!
问题分析
在C语言中,数组下标运算符[]的优先级比间接寻址运算符*更高。所以你写的*buffer[file_lenght]实际上会被解释为*(buffer[file_lenght])——也就是说,它试图把buffer当成一个指针数组,去访问第file_lenght个元素,然后对其解引用。但buffer只是一个指向char*的单指针,根本不存在这么多元素,直接触发了内存越界访问,导致程序崩溃。
修复方案
你需要先通过*buffer获取到malloc分配的内存块的起始地址,再用下标访问末尾位置添加空终止符。把崩溃的那行代码改成:
(*buffer)[file_lenght] = '\0';
额外的健壮性优化
除了这个核心问题,你的代码还有几个潜在风险,建议一起修复:
- 检查
malloc的返回值:如果内存分配失败,malloc会返回NULL,后续操作会引发错误 - 文件打开失败时,将
*buffer设为NULL,避免调用者使用未初始化的指针 - 检查
fread的返回值,确保完整读取了文件内容 - 变量名拼写修正:
file_lenght应该是file_length(拼写错误不影响运行,但影响可读性)
修复后的完整代码如下:
#include "GetText.h" #include <stdlib.h> // 确保包含malloc的头文件 #include <stdio.h> // 确保包含文件操作的头文件 void GetText(const char* filename, char** buffer) { // 先初始化buffer为NULL,避免未初始化的情况 *buffer = NULL; FILE* file = fopen(filename, "rb"); if (file) { long file_length; // 尝试移动到文件末尾获取长度 if (fseek(file, 0, SEEK_END) != 0) { fclose(file); return; } file_length = ftell(file); // ftell失败会返回-1,需要处理 if (file_length == -1) { fclose(file); return; } rewind(file); // 分配内存,包含空终止符的位置 *buffer = (char*)malloc(file_length + 1); if (*buffer == NULL) { // 检查内存分配是否成功 fclose(file); return; } // 读取文件内容,检查读取的字节数 size_t read_bytes = fread(*buffer, 1, file_length, file); if (read_bytes != file_length) { // 读取失败或不完整,释放已分配的内存 free(*buffer); *buffer = NULL; fclose(file); return; } // 添加空终止符,这里已经修复了优先级问题 (*buffer)[file_length] = '\0'; fclose(file); } }
补充说明
- 使用
rb模式打开文件是对的,避免Windows系统下的换行符转换影响文件长度计算 - 注意:
ftell对于某些特殊文件(如管道、设备文件)无法获取正确长度,如果你需要处理这类文件,建议改用循环读取的方式,而不是预分配内存。
内容的提问来源于stack exchange,提问作者Xenos Eitan
相关产品推荐
相关产品推荐

