C语言从文件读取浮点数数组触发段错误,求问题排查及更优实现方案
C语言读取浮点数数组段错误排查与优化
段错误直接原因
- 你读取文件内容到
f_contents时,仅申请了等于文件大小的内存,没有额外预留1字节存储字符串结束符\0。strtok是面向C标准字符串的函数,要求操作对象必须以\0结尾,无结束符会导致strtok访问内存越界,直接触发段错误。
其他潜在问题
- 计数逻辑错误:仅通过空格数量统计浮点数个数,若文件末尾无空格会少算1个元素,若存在多个连续空格、换行、制表符则会多算,最终导致数组越界或数据丢失。
- 可变长度数组(VLA)风险:
double signal[pt_count]是C99引入的变长数组,分配在栈空间,栈内存通常只有几MB,当浮点数数量较多时会触发栈溢出导致段错误。 - 字符分割规则局限:
strtok仅以空格作为分隔符,无法兼容文件中存在换行、制表符等其他空白分隔符的场景。
更简便的实现方案
不需要手动读取整个文件、统计元素个数,直接用fscanf即可自动识别并读取浮点数,配合动态数组扩容即可适配任意长度的输入:
#include <stdio.h> #include <stdlib.h> int main() { const char *sig_file = "替换为你的文件路径"; FILE *fp = fopen(sig_file, "r"); if (fp == NULL) { printf("文件打开失败\n"); return 1; } // 动态数组初始化 double *signal = NULL; size_t pt_count = 0; size_t capacity = 8; // 初始容量可自定义 double val; signal = malloc(capacity * sizeof(double)); if (signal == NULL) { printf("内存申请失败\n"); fclose(fp); return 1; } // 直接循环读取浮点数,自动跳过所有空白符(空格、换行、制表符都支持) while (fscanf(fp, "%lf", &val) == 1) { // 容量不足时扩容2倍 if (pt_count >= capacity) { capacity *= 2; double *temp = realloc(signal, capacity * sizeof(double)); if (temp == NULL) { printf("内存扩容失败\n"); free(signal); fclose(fp); return 1; } signal = temp; } signal[pt_count++] = val; } fclose(fp); // 此处signal数组即为读取到的所有浮点数,pt_count为元素总个数 // 使用完成后释放内存 free(signal); return 0; }
内容的提问来源于stack exchange,提问作者Drakke37
相关产品推荐
相关产品推荐

