我是C的初学者,经过长时间的努力,我在C中完成了我的1500行代码。它运行完美并按预期产生结果,但是当我尝试添加更多输入而不是测试时我遇到了故障
更具体地说,我设法在struct数组中找到了问题的根源。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define ROWS 5000
#define MAXLOGGERS 26
struct data
{
int day;
int month;
int year;
int hour;
int minute;
int second;
float value;
float temp;
float hum;
};
int main()
{
printf("Enter the number of loggers that you want to import: ");
int n = 10;
while (n > MAXLOGGERS)
{
printf("You can input data from maximum %d loggers: ", MAXLOGGERS);
scanf("%d", &n);
}
struct data mydata[n+1][ROWS];
printf("\n\nSuccess!!\n");
}
现在当我使用n = 10或更少时,程序按预期完成。当我将n更改为11或更多时,它会崩溃。
我怀疑结构数组的声明有问题,但我真的无法弄明白。
任何帮助都会受到欢迎! Thanx(:
答案 0 :(得分:1)
struct data mydata[n+1][ROWS];
你正在堆栈上分配一个非常大的(二维)数组,它完全耗尽n >= 11
(在我的系统上也会导致堆栈溢出,显示为分段错误)
对于如此大的数据,您应该在堆上分配内存。这很好(至少在我的机器上):
//struct data mydata[n+1][ROWS];
struct data* mydata = (struct data*)malloc(sizeof(struct data) * (n+1) * ROWS);
printf("\n\nSuccess!!\n");
free(mydata);
只是,对数组的访问不再那么好了,因为你不能使用双索引运算符。你必须自己计算你的抵消额:
// mydata[x][y]; gets:
mydata[x*ROWS + y];
不要监督对free
的调用 - 每个malloc
的数据应该再次free
。从一开始就习惯这个原则(在free
输入时同时考虑malloc
)将有助于防止内存泄漏。
正如评论中提到的(以及引用的答案),堆栈大小通常是有限的,而堆的唯一限制是机器的(但尚未使用的)物理内存的大小,这通常是远的大。如果您的系统内存不足,malloc
将不会崩溃但返回空指针。所以你实际应该检查:
struct data* mydata = (struct data*)malloc(sizeof(struct data) * (n+1) * ROWS);
if(mydata)
{
printf("\n\nSuccess!!\n");
free(mydata);
}
else
{
printf("\n\nOut of memory!!\n");
}