C 结构数组长度错误

C 结构数组长度错误,c,arrays,struct,C,Arrays,Struct,我是C语言的初学者,经过长时间的努力,我用C语言完成了1500行代码。它运行得很好,产生了预期的结果,但当我试图添加比测试更多的输入时,我遇到了崩溃 更具体地说,我设法在struct数组中找到了问题的根源 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #define ROWS 5000 #define MAXLOGGERS 26 s

我是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");
}
#包括
#包括
#包括
#包括
#定义行5000
#定义MAXLOGGERS 26
结构数据
{
国际日;
整月;
国际年;
整小时;
整数分钟;
int秒;
浮动值;
浮子温度;
浮沉的嗡嗡声;
};  
int main()
{
printf(“输入要导入的记录器数量:”;
int n=10;
而(n>最大记录器)
{
printf(“您最多可以从%d个记录器输入数据:”,MaxLogger);
scanf(“%d”和“&n”);
}
结构数据mydata[n+1][ROWS];
printf(“\n\n成功!!\n”);
}
现在,当我使用n=10或更少时,程序按预期完成。当我将n更改为11或更多时,它崩溃

我怀疑struct数组的声明有问题,但我真的无法理解

欢迎任何帮助! Thanx(:

您正在堆栈上分配一个非常大的(二维)数组,该数组完全被
n>=11
消耗掉(在我的系统上,也会导致堆栈溢出,显示为分段错误)

对于如此大的数据,您应该在堆上分配内存。这很好(至少在我的机器上):

仅此而已,由于无法使用双索引运算符,对数组的访问不再那么好了。您必须自己计算偏移量:

// mydata[x][y]; gets: 
mydata[x*ROWS + y];
不要监督对
free
的调用-每个数据
malloc
ed都应该是
free
d。从一开始就习惯这一原则(在键入
malloc
时同时考虑
free
将有助于防止内存泄漏

正如注释(以及引用的答案)中所暗示的,堆栈大小通常是有限的,而堆的唯一限制是机器的(尚未使用的)物理内存的大小,通常是要大得多。如果您碰巧耗尽了系统内存,
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");
}
您正在堆栈上分配一个非常大的(二维)数组,该数组完全被
n>=11
消耗掉(在我的系统上,也会导致堆栈溢出,显示为分段错误)

对于如此大的数据,您应该在堆上分配内存。这很好(至少在我的机器上):

仅此而已,由于无法使用双索引运算符,对数组的访问不再那么好了。您必须自己计算偏移量:

// mydata[x][y]; gets: 
mydata[x*ROWS + y];
不要监督对
free
的调用-每个数据
malloc
ed都应该是
free
d。从一开始就习惯这一原则(在键入
malloc
时同时考虑
free
将有助于防止内存泄漏

正如注释(以及引用的答案)中所暗示的,堆栈大小通常是有限的,而堆的唯一限制是机器的(尚未使用的)物理内存的大小,通常是要大得多。如果您碰巧耗尽了系统内存,
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");
}

经过长时间的努力,我用C完成了我的1500行代码。
…好吧,再想想你的学习方法。
而(n>MAXLOGGERS)
对任何东西都是错误的
n<26
,那么你如何准确地输入?寻求调试帮助的问题(“为什么这段代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建。检查最大堆大小值您是否看到分配
5000*(n+1)*(sizeof(int)*6+3*sizeof(float))
大约:5000*12*(2*6+3*4)=1440000字节。[估计int和float的大小,每个系统可能会改变]。检查您可以分配的最大大小;)
经过长时间的努力,我用C完成了1500行代码。
好吧,再想想您的学习方法。
而(n>MAXLOGGERS)
对于任何
n<26
都为false,那么如何准确输入输入?寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建。检查最大堆大小值您是否看到分配
5000*(n+1)*(sizeof(int)*6+3*sizeof(float))
大约:5000*12*(2*6+3*4)=1440000字节。[估计int和float的大小,可能会因每个系统而改变]。检查您可以分配的最大大小;)您应该避免强制执行malloc的返回。并且,像您这样,始终释放已分配的内存[我们这里不使用Java]@kaldoran好吧,关于做演员和不做演员有不同的意见(对“为什么你应该做”的答案有216票赞成…)。我个人(承认,来自C++)坚持“做演员”分数的观点(再次承认:少数…)。事实上,用户会选择这样做或不这样做。^^Thanx,这很好!不幸的是,即使我将所有mydata[x][y]更改为mydata[x*(n+1)+y];我得到的结果与以前不同,来自一个x的数据在另一个x上被覆盖。这是有意义的,因为在我使用mydata[x][y]之前.小时/分钟/秒来校准记录器,以便