C创建超过一定大小的结构数组会导致崩溃
大家好,我对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
#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。它更易懂,更实用,而且需要更少的字符。这是一种更好的可见性方式。当您编写代码时,您应该始终易于理解正如其他人所说,这是因为我在堆栈上进行分配,内存不足。这一行的改变为我解决了问题。谢谢正如其他人所说,这是因为我在堆栈上进行分配,内存不足。这一行的改变为我解决了问题。谢谢