如何向malloc分配的缓冲区中添加字符?(文件读取场景)
解决方案
你需要用一个索引变量跟踪缓冲区的写入位置,每次读取字符后将其存入缓冲区对应位置,最后必须给字符串加上结束符'\0'(C语言字符串依赖这个字符才能正常识别)。另外要检查malloc是否成功,避免空指针问题。
修改后的代码如下:
if ((f = fdopen(fd, "r")) != NULL) { // 移动到文件末尾 fseek(f, 0, SEEK_END); // 获取文件大小 sz = ftell(f); // 回到文件开头 rewind(f); // 多分配1个字节存字符串结束符'\0' char *string = (char *)malloc((sz + 1) * sizeof(char)); if (string == NULL) { // 内存分配失败的处理逻辑 fclose(f); return; // 或其他错误处理方式 } int idx = 0; // 缓冲区起始索引 while ((ch = fgetc(f)) != EOF) { string[idx++] = ch; // 将字符存入缓冲区,索引自增 } string[idx] = '\0'; // 给字符串添加结束符 // 此处可使用string,比如打印、处理等操作 // 用完后释放内存、关闭文件 free(string); fclose(f); }
关键注意点
- 分配内存时必须多留1个字节用于存储
'\0',否则字符串会因缺少结束符出现未定义行为。 - 必须检查
malloc返回值,若为NULL说明内存分配失败,需及时处理错误。 - 文本模式下
fseek+ftell获取的文件大小可能不准确(比如Windows换行符\r\n会被转换为\n,实际读取字符数少于文件大小),如果处理二进制文件,建议用"rb"模式打开。 - 使用完缓冲区后要调用
free释放内存,避免内存泄漏;文件操作完成后必须调用fclose关闭文件。
内容的提问来源于stack exchange,提问作者darrkenn
相关产品推荐
相关产品推荐

