You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:39:01