struct数组长度错误

时间:2017-04-12 08:55:45

标签: 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

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(:

1 个答案:

答案 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");
}