【问题标题】:C Memory error in structs结构中的 C 内存错误
【发布时间】:2012-03-07 19:42:21
【问题描述】:

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

【问题讨论】:

  • 编译时错误有哪些问题?运行时错误?
  • 那个 sn-p 不能导致内存错误,它只创建一个类型,而不是任何变量。请提供一个完整的最小程序来演示您遇到的错误。 sscce.org
  • 它会产生什么内存错误?该程序不会导致编译时错误。如果您没有足够的内存,它可能会导致运行时错误。
  • 什么样的内存错误?你是在栈上分配还是在堆上分配?
  • 我添加了分配方式

标签: c memory struct


【解决方案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;
}

【讨论】:

    【解决方案2】:

    要么使用动态分配,要么通过执行增加堆栈大小(断言类 linux 操作系统):

    ulimit -s 1000000

    大小以 kB 为单位,因此允许的最大堆栈大小约为 100MB。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-16
      • 2017-01-15
      • 2017-10-25
      • 2018-01-21
      • 1970-01-01
      • 2020-09-17
      • 2023-03-09
      相关资源
      最近更新 更多