C创建超出特定大小的结构数组会导致崩溃

时间:2018-01-12 08:49:30

标签: c arrays struct

大家好我是C的新手(本周刚刚开始),并且想确保我没有看错了兔子的家,并希望可能指向正确的兔子洞。

我创建了一个结构:

#define MAX 64
#define ARRAY_SIZE 2048

struct object {
    int q, c, p;
    char name[MAX]; //Stores string up to 63 characters
    char arr[ARRAY_SIZE][MAX]; // Creates an array of 2048 cells with string of length 63 max
};

int main(){
...
...
int variable = 30;
struct object l[variable]; //This is where the crash happens. But only when either variable is too large (for instance works on 15 just fine, but anything over 20 it crashes), or when Array_SIZE is too larger, for instance works fine with 1024 but 2048 crashes.
...
...
}

我遇到崩溃的错误如下:进程在cmd窗口中返回-1073741571(0xC00000FD)。以下是IDE中的调试器: 编程接收信号SIGSEGV,分段故障。 [Inferior 1(流程12120)退出,代码为030000000375]

我是否正在做一些明显错误的声明我如何声明一个结构数组?为什么大数字不起作用,但较低的数字有效?

上述错误是否表明我正在某处访问某些界限?我一直在代码中上下,似乎没有找到任何理由为什么较大的数字不起作用而较低的数字不起作用。我的内存占用似乎不是问题,只有几兆内存。

我需要帮助以寻找什么(我无法找到任何访问任何超出范围的实例,所以我感觉我不是在追逐正确的兔子而需要寻找其他东西)?或者也许我在不知情的情况下为C做违法行为?

3 个答案:

答案 0 :(得分:2)

您遇到内存大小问题,请尝试增加程序的内存大小。

如果你想使用大数组大小并因此分配大量内存,你不应该静态但动态地分配。 所以你应该使用malloc

typedef struct object {
  int q, c, p;
  char name[MAX]; //Stores string up to 63 characters
  char arr[ARRAY_SIZE][MAX];
} myObject ;

int variable = 30;
myObject *l = malloc(sizeof(myObject) * variable);

我建议您静态声明一个2048的数组,因此您应该使用函数启动结构。

typedef struct object {
  int q, c, p;
  char name[MAX]; //Stores string up to 63 characters
  char *arr[MAX];
} myObject ;

myObject    *createNewObject() {
    myObject *toReturn = malloc(sizeof(myObject) * variable);

    if (toReturn == NULL)
       return NULL;
    toReturn->arr = malloc(sizeof(char) * ARRAY_SIZE);
    return (toReturn);
}

void        freeMyObject(myObject *objectToFree)
{
    if (objectToFree && objectToFree->arr =! NULL)
       free(objectToFree->arr)
    if (objectToFree)
       free(objectToFree)
}

void main()
{
    myObject *myNewObj = createNewObject()

    // You can do some stuff with myNewObj but always verify the pointers
    freeMyObject(myNewObj);
}

当你使用malloc时,你也应该使用valgrind进行调试,这样你就不会有内存丢失或问题。

希望我帮助

答案 1 :(得分:2)

我认为您的程序崩溃是因为您在堆栈上静态分配了太多内存。 尝试使用malloc或calloc函数。它在堆上动态分配内存,例如:

struct object *l = malloc(variable*sizeof(struct object));

不要忘记使用免费功能将其释放。

free(l);

答案 2 :(得分:1)

您遇到的问题是 - 您使用了 自动内存分配 。由于自动存储大小的限制,你的程序崩溃了 - 你要求的比你应该多。

那么解决方案是什么?

  1. 静态内存分配:
  2. 解决方案

         static struct object l[variable];
    
    1. 动态内存分配

      struct object *ptr = malloc( sizeof *ptr * variable);
      
    2. 这些分配的存储与自动变量不同 - 因此不受大小约束的影响。在这种情况下,您必须释放动态分配的内存。这就是为什么你会解决你遇到的问题。

      静态分配不是一个混乱的免费术语。所有这些类型的变量都有不同的范围 - 生命周期。标准从未提及堆栈或堆。遵循这些实现是为了存储自动分配的内存和动态分配的内存。