【问题标题】:Bus error/segmentation fault error for program: what do these errors mean?程序的总线错误/分段错误错误:这些错误是什么意思?
【发布时间】:2014-06-10 13:09:40
【问题描述】:

我从这段代码中得到一个总线错误 10。当我输入打印语句时,出现分段错误错误。我在一个更大的程序中使用这两个函数来计算矩阵的行列式。这些错误是什么意思?我是 C 环境的新手。谢谢!

int* cofactor(int* matrix, int co_row, int co_column, int size_of_matrix){
 int* result;
 int i, offset;
 int row, column;

 result = duplicate_matrix(matrix, size_of_matrix-1);
 i = 0;
 offset = row*size_of_matrix+column;
 for (row = i; row < size_of_matrix; row++){
  for (column = i; column < size_of_matrix; column++){
   if ((row != co_row) && (column != co_column)){
    i = offset;
    i += 1;
    *result = i;
   }
   return result;
  }
 }
}

int* determinant(int* matrix, int size_of_matrix){
 int sign, x, one=1;
 int* size;
 int* result;
 int* the_sign;
 int* comatrix;

 sign = one;

 *the_sign = sign;
 *size = size_of_matrix;
 result = malloc(sizeof(int) * size_of_matrix*size_of_matrix);
 comatrix = malloc(sizeof(int) * size_of_matrix*size_of_matrix);
 if (*size == one){
  return size;
 }
 else{
  for (x = 0; x < size_of_matrix; x++){
    comatrix = cofactor(matrix, 0, x, size_of_matrix);
    *result = x;
    *result += *matrix;
    *matrix *= *the_sign;
    *the_sign *= *determinant(comatrix, size_of_matrix);
    *the_sign *= -1;
    *result = *the_sign;
  }
  return result;
 }
}

【问题讨论】:

  • 那些错误意味着你的指针都搞砸了,没有按照你的想法去做。例如,*the_sign = sign; 会导致程序崩溃,因为您正在取消引用尚未初始化的指针。
  • 代码有很多问题:offset = row*size_of_matrix+column 那时行和列没有初始化; *result = i 结果永远不会改变,所以你总是写到一个位置; return result 在 for 循环内。我只看了第一个函数。
  • 很难看出duplicate_matrix() 是如何避免使用malloc() 进行动态内存分配的——但是没有代码可以释放它创建的任何矩阵。这会给您留下一个问题——duplicate_matrix() 中的无效代码或内存泄漏。
  • 你认为*the_sign = sign;在做什么?

标签: c debugging recursion matrix segmentation-fault


【解决方案1】:

关于总线错误故障和分段故障之间的区别,有一篇很好的 SO 帖子。

https://stackoverflow.com/a/212585/2724703

它们通常意味着您的程序设计不当,并且由于某种原因您试图访问不合法的内存。在您的程序中,有许多问题需要纠正才能正常工作。如:

您的程序正在尝试访问/写入未初始化的 指针,因此可能导致总线/分段故障。您的程序似乎在不需要的地方使用指针而不是普通变量。

//这些变量应该定义为普通的而不是指针。
整数大小; int the_sign;

我认为您还应该开始查看您的编译器警告。在这些情况下,编译器应该会在示例程序中向您发出类似于 gcc/g++ 的警告。请注意它们并从您的程序中纠正这些警告消息。

int* i;
int j;

*i = j;

$ g++ -Wall foo.cpp foo.cpp: 在函数'int main()'中: foo.cpp:13:7: 警告:“i”可能在此函数中未初始化使用 [-W 可能未初始化] *i = j; ^ foo.cpp:13:7: 警告:“j”可能在此函数中使用未初始化 [-Wmaybe-uninitialized]

此外,您需要释放您的程序由 malloc 分配的内存。否则会出现内存泄漏。

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    相关资源
    最近更新 更多