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

C创建超过一定大小的结构数组会导致崩溃,c,arrays,struct,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 cel

大家好,我对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,分段故障。 [次级1进程12120退出,代码030000000375]

我在声明结构数组的方式上是否有明显的错误?为什么大数字不起作用,而小数字起作用

上面的错误是否表明我正在访问某个出界的东西?我在代码上下翻来覆去,似乎找不到大数字不起作用而小数字起作用的任何原因。我的内存占用似乎不是问题,只有几兆内存


我需要帮助寻找什么我找不到任何访问任何越界的实例,所以我感觉我没有追逐正确的兔子,需要寻找其他东西?或者我在不知不觉中为C做了一些非法的事情?

如果内存大小有问题,请尝试增加程序的内存大小

如果您想使用较大的数组大小并分配大量内存,则不应静态分配,而应动态分配。 所以你应该使用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进行调试,这样就不会出现内存丢失或问题


希望我能帮助您解决内存大小问题,请尝试增加程序的内存大小

如果您想使用较大的数组大小并分配大量内存,则不应静态分配,而应动态分配。 所以你应该使用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进行调试,这样就不会出现内存丢失或问题


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

struct object*l=mallocvariable*sizeofstruct object

不要忘记使用free函数释放它


弗里尔

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

struct object*l=mallocvariable*sizeofstruct object

不要忘记使用free函数释放它


弗里尔

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

那么解决方案是什么呢

静态内存分配: 溶液存在

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

struct object *ptr = malloc( sizeof *ptr * variable);
这些分配的存储不同于自动变量,因此不受大小限制。在这种情况下,您必须释放动态分配的内存。这就是为什么你会避开你的问题


静态分配不是一个没有混淆的术语。所有这些类型的变量都有不同的作用域-生存期。标准从未提及堆栈或堆。它是根据这些实现来存储自动分配的内存和动态分配的内存。

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

那么解决方案是什么呢

静态内存分配: 溶液存在

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

struct object *ptr = malloc( sizeof *ptr * variable);
这些分配的存储不同于自动变量,因此不受大小限制。在这种情况下,您必须释放动态分配的内存。这就是为什么你会避开你的问题


静态分配不是一个没有混淆的术语。所有这些类型的变量都有不同的作用域-生存期。标准从未提及堆栈或堆。下面的实现用于存储自动分配的内存和动态分配的内存。

可能是因为您没有显示某些内容。每个struct对象实例静态分配131K内存,即堆栈上的内存。与堆相比,堆栈没有那么大。你的内存快用完了…是的。使用动态内存分配代替malloc或friendsBTW 0xC00000FD是堆栈溢出的Windows错误代码。可能是因为您没有显示某些内容。每个结构对象实例都静态分配131K o
f内存,即堆栈上的内存。与堆相比,堆栈没有那么大。你的内存快用完了…是的。使用动态内存分配代替malloc或friendsBTW 0xC00000FD是堆栈溢出的Windows错误代码。Sacha是的,谢谢!但是,为什么要使用函数而不是像nabil建议的那样更改一行呢?另外,为什么您要使用typedef来声明结构,而不是我是如何做的?这是一种更好的方法吗?当您在结构中使用结构、malloc和数组时,您应该学会将代码解构为几个函数。假设必须在结构中添加一些动态malloc数组,只需修改创建函数即可。你应该像我处理内存时那样分解你的代码。即使你没有!关于typedef,我只是喜欢使用struct。它更易懂,更实用,而且需要更少的字符。这是一种更好的可见性方式。当您编写代码时,您应该始终易于理解是的,谢谢!但是,为什么要使用函数而不是像nabil建议的那样更改一行呢?另外,为什么您要使用typedef来声明结构,而不是我是如何做的?这是一种更好的方法吗?当您在结构中使用结构、malloc和数组时,您应该学会将代码解构为几个函数。假设必须在结构中添加一些动态malloc数组,只需修改创建函数即可。你应该像我处理内存时那样分解你的代码。即使你没有!关于typedef,我只是喜欢使用struct。它更易懂,更实用,而且需要更少的字符。这是一种更好的可见性方式。当您编写代码时,您应该始终易于理解正如其他人所说,这是因为我在堆栈上进行分配,内存不足。这一行的改变为我解决了问题。谢谢正如其他人所说,这是因为我在堆栈上进行分配,内存不足。这一行的改变为我解决了问题。谢谢