【问题标题】:segment violation error on function call函数调用上的段违规错误
【发布时间】:2012-12-04 22:44:02
【问题描述】:

我编写了一个 C 程序来查找给定点集(随机生成)中所有点的 k 个最近邻。问题是当我将点数(以及因此数组大小)增加到 10000 时,只要我调用该函数以找出最近的邻居,程序就会给出段冲突错误。我无法使用调试器进入函数内部。一旦我执行“Step Into”,程序就会崩溃。

我使用了代码块和 Eclipse CDT(在 Windows 7 上),两者都在同一点给出错误。在代码块的情况下,它给出了段冲突,在 Eclipse 的情况下,它首先显示 - “在 0x4039a7 处没有可用于 __chkstk_ms() 的源”,然后错误来自操作系统本身 - “KNN.exe 已停止工作” 但是该程序在 Linux(Ubuntu 32 位)上运行良好。

这里是sn-p的代码:

#define MAX_SIZE 10000

    int main()
    {
        int n = MAX_SIZE;
        int k = 3;
        int i;


        double points[MAX_SIZE*2];  //2-D array in row-major order
        double result[MAX_SIZE*3*2];

        srand(time(NULL));

        for(i=0; i < n; i++)
        {
            points[i*2] = (double)rand()/(double)RAND_MAX;
            points[i*2 + 1] = (double)rand()/(double)RAND_MAX;
        }


        seek(points,n,k,result);   //<---------- ERROR

        seek(points,n,k,result);   //<------------ NO ERROR 
   ....
  }

 void seek(const double * const points, int n, int k, double *result)
 {

  TreeNode qtree[MAX_SIZE];
  int order_array[MAX_SIZE];

  int num_nodes = build_quadtree(a, n, k, qtree,order_array);   
  ......
  }

结构树节点 { 内部标识; 整数点; int start_order; int end_order; 诠释父母; 诠释孩子[4]; 结构矩形矩形; enum boolean is_leaf; };

结构点 { 双x; 双 y; };

结构矩形 { 内部标识; 双倍 xmin,xmax,ymin, ymax; 结构点中点; };

更令人困惑的是,我有另一个具有相同参数的函数运行没有任何问题。 请提供有关如何调试此问题的建议。

编辑:-。我已经发布了 seek() 函数的前几行。正如回复所指出的,我实际上在 seek 函数上分配了很多内存,但我想知道为什么这在 linux 中不是问题。

【问题讨论】:

  • 我们有没有机会看到seek() 在做什么? points[] 的加载器似乎没有任何问题。

标签: c windows segmentation-fault


【解决方案1】:

我认为您超出了可用堆栈(请参阅 _chkstk 上的 MSDN 文档)。尝试动态分配数组

int main()
{
    double* points = malloc(sizeof(double) * MAX_SIZE*2];
    double* result = malloc(sizeof(double) * MAX_SIZE*3*2];
    ...
    free(points);
    free(result);
}

调用seek 时发生堆栈溢出。您尚未发布它的代码,但可能还必须对其进行返工以减少其堆栈使用。

【讨论】:

  • 假设 8 字节双精度和 4 字节整数,此函数中使用的总堆栈为 640012 字节,这在 Windows 上 CRT 的 1MB 默认堆栈内。我同意seek() 可能是问题所在。
【解决方案2】:

也许下面的代码才是真正的罪魁祸首。 qtree 和 orderarray 也都是堆栈分配的。我会将 MAX_SIZE 更改为较低的值,然后再查看问题。

TreeNode qtree[MAX_SIZE]; int order_array[MAX_SIZE];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多