C:使用 fprintf 导出大型数组会使编译器崩溃?

标签 c export

在 C 中,我想将一维数组( float )导出到 CSV 文件以供其他程序打开。我编写了以下辅助函数来执行此操作:

#include <stdio.h>
#include <stdlib.h>
void float1DExportCSV(float *ptr, int n){
    FILE *f;
    f = fopen("FloatOutput.CSV", "w");
    int i = 0;
    for (i = 0; i < n-1; i++){
        fprintf(f, "%f", ptr[i]);
        fprintf(f, "%c", ',');
    }
    fprintf(f, "%f", ptr[n-1]);
}

然后我尝试在包含 10 个元素的数组上测试它,如下所示:

#define n 10
int main(void){
    float array[n];
    int i;
    for(i = 0; i < n; i++){
        array[i] = 4.3f*i;
    }
    float1DExportCSV(array, n);

    return 1;
}

这工作正常,并且生成的文件可以正确打开。将 n 更改为更大的数字(最多 400,000 左右)也可以正常工作。

但是,在大约 500,000 个元素标记处,程序在构建时就崩溃了。我想要导出到 CSV 的数组有超过 500,000 个元素。有没有一种可靠的方法来进行这种类型的导出?像我上面使用的循环 fprintf 方法不是导出大型数据集的好方法吗?

最佳答案

当数组大小太大时,使用堆内存。

n太大时,在堆栈上分配数组会导致堆栈溢出。这时候,在堆上分配内存就是答案。

而不是

float array[n];

使用

float* array = malloc(n*sizeof(float));  

确保释放内存。添加

free(array);

使用完数组后。

关于C:使用 fprintf 导出大型数组会使编译器崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25436562/

相关文章:

c++ - LTO、去虚拟化和虚拟表

api - 通过 HTTP API 导出和导入 Grafana Dashboard

java - 将 Eclipse NAT 表导出到 CSV/Excel

mongodb - 如何将 mongodb 字符集设置为 utf8?

Android Studio,LOCAL_C_INCLUDES +=/foo/bar/include 不起作用?

c - main 的多重定义首先在这里定义

CMake 找不到库

php - 如何使用 Adminer 导出数据库?

c# - 在 ASP.NET 中将 HTML 内容写入 Word 文档时出现问题

c - MPI并行编程