C:使用fprintf编译器导出大型阵列?

C:使用fprintf编译器导出大型阵列?,c,export,C,Export,在C语言中,我想将一个1D数组(浮点数)导出到一个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++){

在C语言中,我想将一个1D数组(浮点数)导出到一个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]);
}
#包括
#包括
void float1DExportCSV(float*ptr,int n){
文件*f;
f=fopen(“FloatOutput.CSV”,“w”);
int i=0;
对于(i=0;i
然后我尝试在一个包含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 10
内部主(空){
浮点数组[n];
int i;
对于(i=0;i
这可以正常工作,并且生成的文件可以正确打开。将
n
更改为更大的数字(最多40万左右)也可以正常工作


然而,在500000元素标记附近的某个地方,程序只是在构建时崩溃。我要导出到CSV的阵列包含超过500000个元素。有没有一种强有力的方式来进行这类出口?像我上面使用的循环
fprintf
方法不是导出大型数据集的好方法吗?

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

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

而不是

float array[n];
使用

确保释放内存。加

free(array);

一旦使用完数组。

您的问题是在堆栈上分配了局部变量。如果对数组使用静态或全局变量,则将在.bss段中分配该变量。对于这个简单的测试用例,不需要malloc()或free()复杂性

#define n 500000
float array[n];  /* or static float array[n]; */
int main(void){

    int i;
    for(i = 0; i < n; i++){
        array[i] = 4.3f*i;
    }
    float1DExportCSV(array, n);

    return 1;
}
#定义n 500000
浮点数组[n];/*或静态浮点数组[n]*/
内部主(空){
int i;
对于(i=0;i
浮点数组[n]:堆栈溢出。很可能是堆栈空间不足。在linux上,您可以使用ulimit-s查看堆栈空间。同样,ulimit-s会将堆栈大小增加到以kB为单位的数字。请注意,通常在成功时从
main()
返回
0
EXIT\u SUCCESS
(从
)<代码>1
通常表示故障。这不会影响编译器;它不会影响程序崩溃与否。@JonathanLeffler:Aha,那一定是我的代码崩溃的原因吧!:)更重要的是,谢谢你的提示(我刚刚开始C)。另一个旁注:你可以将循环中的两个
fprintf
s组合成一个
fprintf
,如下所示:
fprintf(f,“%f,”,ptr[I])。换句话说,只要在
%f
后面加上逗号就行了。谢谢,我认为这与内存管理问题有关,但我认为问题发生在
for
-循环期间,我并不怀疑这只是数组分配步骤本身!堆内存有哪些内存限制?是否只是您的计算机有多少可用内存?从::对于ARM、x86和x64机器,默认堆栈大小为1MB。对于gcc,可以在@DumpsterDoofus中找到这些值:堆栈限制是特定于平台的,通常是可配置的。在Windows上,我相信限制在2 MiB左右(了解情况的人可能会提出矛盾),但在基于Unix的系统上,限制通常更大(如8 MiB)。具体来说,Mac OS X上的默认值是8192 KiB或8 MiB。@JonathanLeffler:Hmm,所以堆限制通常在2MB到8MB之间?这很奇怪,我刚刚导出了一个10000000个元素的浮点数组(或大约40MB,基于32位的浮点大小),没有任何明显的问题。是否有查询堆限制的命令提示符命令?无法键入-我的意思是“Stack”,但写了“heap”;我及时修正了我的评论。
#define n 500000
float array[n];  /* or static float array[n]; */
int main(void){

    int i;
    for(i = 0; i < n; i++){
        array[i] = 4.3f*i;
    }
    float1DExportCSV(array, n);

    return 1;
}