在C中为大程序分配内存

时间:2013-12-27 01:43:58

标签: c memory-management for-loop file-io matrix

问题是.exe文件在输入文件至少为20行时停止; 当我排除包含以下矩阵的操作的4个大for loops时:

int rounded_marks[42][100];
int reassessed[22][k];
int averagecounter[14][k];

...程序运行正常。 当我添加这些大循环(我厌倦了将它们联合在一起,然后会有非常大的循环,以及相同的.exe终止)时,终止.exe。

代码中每个for loop的总行数几乎为300。

请检查分配的内存是否足以进行操作?

我应该为矩阵分配内存吗?应该怎么样?

感谢您的关注。

P.S。我无法调试,PC上没有可用的软件(禁止安装):(

input.dat是多行csv文件。

以下是.c代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int main(void)

    {
    int lines_allocated = 100;
    int max_line_len = 150;
    double c[42][1000]={0};
    int print;

    char **words = (char **)malloc(sizeof(char*)*lines_allocated);
    if (words==NULL)
        {
        fprintf(stderr,"Out of memory (1).\n");
        exit(1);
        }

    FILE *fp = fopen("input.dat", "r");
    if (fp == NULL)
        {
        fprintf(stderr,"Error opening file.\n");
        exit(2);
        }

    int i;
    for (i=0;1;i++)
        {
        int j;

        if (i >= lines_allocated)
            {
            int new_size;

            new_size = lines_allocated*2;
            words = (char **)realloc(words,sizeof(char*)*new_size);
            if (words==NULL)
                {
                fprintf(stderr,"Out of memory.\n");
                exit(3);
                }
            lines_allocated = new_size;
            }
        words[i] = malloc(max_line_len*sizeof(*(words[i])));
        if (words[i]==NULL)
            {
            fprintf(stderr,"Out of memory (3).\n");
            exit(4);
            }
        if (fgets(words[i],max_line_len-1,fp)==NULL)
            break;

        for (j=strlen(words[i])-1;j>=0 && (words[i][j]=='\n' || words[i][j]=='\r');j--)

        words[i][j]='\0';
        }

    int j;
    int k=i; // k is number of lines
    for(j = 0; j < k; j++)
    {

        char *pptr = words[j];
        int l;
        for (l = 0; l < 42; l++)
        {
            char *ptr = strchr(pptr, ',');
            if (ptr) 
            {
                *ptr = 0;
                c[l][j] = atof(pptr);
                pptr = ptr + 1;
            }
            else if (isdigit(*pptr)) 
            {
                c[l][j] = atof(pptr);
            }
        }    
    }

    int rounded_marks[42][100];
    int averagecounter[14][k];
    int reassessed[22][k];
    for (j=0;j<k;j++)
    {
             //doing some complicated operations for 1st time
    }
    for (j=0;j<k;j++)
    {
             //doing some complicated operations for 2nd time
    }
    for (j=0;j<k;j++)
    {
             //doing some complicated operations for 3rd time
    }
    for (j=0;j<k;j++)
    {
             //doing some complicated operations for 4th time
    }
}

2 个答案:

答案 0 :(得分:3)

大多数实现对堆栈帧的大小有相对较小的限制,因此您不应尝试将大型数组分配为局部变量。但是,静态数组和堆可能非常大。因此,将c的声明移出main,并使其成为全局静态变量。

对于大小在运行时确定的变量,如依赖于k的数组,您应该使用malloc()在堆上分配。

答案 1 :(得分:1)

我更像是一个ObjC有点人,但是第一个循环:

for (i=0;1;i++)

这不会永远运行(因为1总是如此)并且最终因为第一个循环分配内存而耗尽内存吗?