C结构中的内存错误

时间:2012-03-07 19:42:21

标签: c memory struct

以下代码段会导致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;
}

2 个答案:

答案 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。