问题是.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
}
}
答案 0 :(得分:3)
大多数实现对堆栈帧的大小有相对较小的限制,因此您不应尝试将大型数组分配为局部变量。但是,静态数组和堆可能非常大。因此,将c
的声明移出main,并使其成为全局静态变量。
对于大小在运行时确定的变量,如依赖于k
的数组,您应该使用malloc()
在堆上分配。
答案 1 :(得分:1)
我更像是一个ObjC有点人,但是第一个循环:
for (i=0;1;i++)
这不会永远运行(因为1总是如此)并且最终因为第一个循环分配内存而耗尽内存吗?