【问题标题】:Segmentation fault in c - probably connected with pointersc中的分段错误-可能与指针有关
【发布时间】:2014-01-28 13:47:29
【问题描述】:

当我在我的程序中添加这个函数时,我得到这个错误:“分段错误”。我发现它可能与指针有关。

这是我的功能:

void deBoor(double* D, double* t, double x, int k, int n, double* R){
   int i,j,l;
   double ret[3];
   double* P=(double*)malloc(n*sizeof(double));
   for(i=0; i<n; ++i) P[i]=D[i];
   j=k;
   while(x<t[j]) ++j;
   while(x>=t[j+1]) ++j;
   for(l=1; l<=k; ++l){
       for(i=j; i>=j-k+l; --i)
       {
          P[i]=(x-t[i])/(t[i+k+1-l]-t[i])*P[i]+(t[i+k+1-l]-x)/(t[i+k+1-l]-t[i])*P[i-1];
       }
   }
   R[0]=P[j];
   free(P);
}

这是函数的调用:

deBoor (kontrolne_tocke, prosirena_particija, xx, k, duljina, R);

【问题讨论】:

  • 我几乎不敢问,但是:你调试了吗?
  • 启动 gdb 或其他一些调试器,看看故障在哪里。如果您仍然卡住,也可以创建一个minimal example
  • 是的,我做到了。没有显示错误,当我执行它时,我的部分代码只打印结果,并且在该函数的部分写入“分段错误”
  • 然后阅读如何调试,例如在代码的各个点设置断点,查看分段错误发生的位置(在什么指令处)
  • 您根本不检查您的输入。你怎么知道 R[1] 或 R[2] 是有效的?请注意,参数 n 的值很关键,其他参数必须已正确分配,以便对它们的访问有效。我只能相信所有这些都已经在调用者代码中完成了。我不相信。

标签: c pointers segmentation-fault


【解决方案1】:

代码相当不安全。一些问题,不仅是安全问题,而且其中一些问题肯定会导致您的崩溃:

  1. 为清楚起见,输入参数应为const 指针。
  2. malloc() 的返回值没有被检查,所以如果分配失败,你就完蛋了。
  3. Don't cast the return value of malloc() in C
  4. 不要使用循环复制,使用memcpy()
  5. 不能保证j 不会越界。
  6. ret 数组从未使用过。

【讨论】:

  • 也可能被零除。
  • j 超出范围。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2013-09-18
  • 2016-02-24
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多