以下代码段会导致MAXV值较大的内存错误。如何定义这个结构,我可以将它用于边缘和度数的许多值?
#define MAXV 1441295
typedef struct {
edgenode *edges[MAXV+1];
int degree[MAXV+1];
int nvertices;
int nedges;
int directed;
} graph;
initialize_graph(graph *g, bool directed)
{
int i;
g -> nvertices = 0;
g -> nedges = 0;
g -> directed = directed;
for (i=1; i<=MAXV; i++) g->degree[i] = 0;
for (i=1; i<=MAXV; i++) g->edges[i] = NULL;
}
答案 0 :(得分:1)
从我的水晶球中读取,我发现你正在创建graph
类型的局部变量。每个局部变量都超过10,000,000字节,这会溢出系统中可用的堆栈空间。
尝试将对象创建为静态对象或堆分配对象。
也就是说,不要这样做:
int f(graph g) {
graph newg = g;
}
相反,这样做:
graph g;
int f() {
g.ediges[g.nedges++] = 0;
}
或者这个:
int f(graph *pg) {
pg->edges[17] = 0;
}
答案 1 :(得分:1)
通过执行以下命令来使用动态分配或增加堆栈大小(断言类似Linux的操作系统):
ulimit -s 1000000
大小以kB为单位,因此最大允许堆栈大小约为100MB。