【问题标题】:Segmentation fault error when compiler with one gcc compiler but not with other gcc compilers [closed]使用一个 gcc 编译器但不使用其他 gcc 编译器时的分段错误错误[关闭]
【发布时间】:2013-07-15 22:11:46
【问题描述】:

我在我的代码中遇到了分段错误,我不确定是什么原因造成的。更奇怪的是,当我在 gcc-4.4.6 RH6 中编译/运行时,我没有收到任何错误,但在其他编译器/linux 发行版上,我收到了分段错误错误。

这是我认为可能会产生问题的部分代码的 sn-p:

int BIN_SIZE=(2*width)/bins;
//binCounts and binCounts2 store the fragment counts in each bin. mask=1 flags histone modification site

float **binVals;

binVals = (float **)malloc(chromNum*sizeof(int *));
//Initialize the arrays
totalBinNum = 0;

for (i=0;i<chromNum;i++)
{
    totalBinNum += chromInfo[i].chromSize/BIN_SIZE+1;
    binVals[i] = (float *)malloc((chromInfo[i].chromSize/BIN_SIZE+1)*sizeof(float));
    memset(binVals[i], 0, (chromInfo[i].chromSize/BIN_SIZE+1)*sizeof(float));
}

如果您知道一些可能导致错误的简单方法,请告诉我?否则它也可能在代码的其他部分导致不是智能 Q :(

【问题讨论】:

  • malloc(chromNum*sizeof(int *)); 我在这里看不到int*
  • 不是直接的答案,但在 Linux 上,使用调试信息 ('-g') 很容易编译,使用 GDB 运行程序,并使用“backtrace”命令(如果需要)。我会尝试这样做,因为如果您知道错误发生在哪一行,那么找出您做错了什么会容易得多。 :)
  • 你试过 valgrind 吗?
  • 并不是说我不信任您的代码,但我看到分段错误最有可能发生的地方是您的 chromInfo 未正确初始化为 chromNum 大小。

标签: c gcc segmentation-fault


【解决方案1】:

这样做会更精确:

binVals = malloc(chromNum*sizeof(float *));

但这不太可能是错误的原因,因为您可以预期 2 个指针,即使指向不同类型的 int*float*,将具有相同的大小。简而言之,错误的根源可能在您代码中的其他地方。

其他一些建议:

  1. 我建议删除其他 malloc 中的其他类型。
  2. 我会使用一些临时变量来存储 chromInfo[i].chromSize/BIN_SIZE+1,这样您就不必重复表达式 3 次,很可能会出现剪切和过去的错误。
  3. 您可以在一次calloc 调用中将mallocmemset 压缩为零。

【讨论】:

  • 或者更好:binVals = malloc(chromNum * sizeof *binVals);
  • 我仍然遇到段错误,我认为它可能在代码的另一部分......谢谢。
  • 他在那里有int *,而不是intfloat *int * 的大小很可能相同。
  • @CarlNorum 你是对的,我已经编辑了我的答案
  • @Dnaiel:是的,我确认:代码可以改进,但没有明显的分段错误原因:它必须在代码中的其他地方触发。
猜你喜欢
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多