C 结构中的内存错误

标签 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;
}

最佳答案

从我的 Crystal 球中看到,我看到您正在创建 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;
}

关于C 结构中的内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9608000/

相关文章:

c - 分段故障Strdup

c - c 中的 sleep 函数 linux 中的疯狂错误

c++ - 为程序全局设置 Linux 上的默认堆栈大小

arrays - Julia 矢量 : Excessive Memory Usage

memory - 当向 DRAM 发出读取请求时,为什么我们需要读取标签和数据,而不是仅读取数据?

c - 如何使用程序检查总缓存大小

python - 限制 RAM : python crashes instead of MemoryError

c# - 从 C# 调用 C DLL 函数 - 参数结构太大或太复杂而无法编码(marshal)

C# 'is' 结构类型检查 - 奇怪的 .NET 4.0 x86 优化行为

c - 在 C 中通过引用传递结构,但修改并非全部存在