向现有结构添加元素会使函数在分段错误时崩溃

Posted

技术标签:

【中文标题】向现有结构添加元素会使函数在分段错误时崩溃【英文标题】:adding element to an existing struct makes function crash on segmentation error 【发布时间】:2012-09-21 04:17:38 【问题描述】:

我有以下结构:

struct FeatureMatch 
    int id1, id2;
    double score; 
;

被此函数调用时运行良好:

void ssdMatchFeatures(const FeatureSet &f1, const FeatureSet &f2, vector<FeatureMatch> &matches, double &totalScore) 
    int m = f1.size();
    int n = f2.size();
    matches.resize(15000);
    totalScore = 0;

    double d;
    double dBest;
    int idBest;
   printf("2");
    for (int i=0; i<m; i++) 
        dBest = 1e100;
        idBest = 0;

        for (int j=0; j<n; j++) 
            d = distanceSSD(f1[i].data, f2[j].data);

            if (d < dBest) 
        dBest = d;
        idBest = f2[j].id;
            
        
        printf("1\n");
        matches[i].id1 = f1[i].id;
        matches[i].id2 = idBest;
        matches[i].score = -dBest;
     //   matches[i].second=1;
        totalScore += matches[i].score;
    

    printf("3");

但是,一旦我通过添加新元素来修改结构:

struct FeatureMatch 
    int id1, id2;
    double score, second; 
;

另一个名为 second 的 double 值会使上述函数在分段错误时崩溃。 1,2,3 的输出显示如下:

21 1 1 1 1 . . . 1

但在崩溃之前永远不会达到 3。

这里发生了什么?即使我从不修改matches[i].second,也会发生这种情况。

【问题讨论】:

你有多个源文件吗?重建 everything,以确保您没有在某处使用过时定义的模块。 (如果这样可以解决问题,请考虑在 Make 过程中添加或修复依赖项支持。) 另外,虽然这听起来很明显,但请确保m &lt; 15000,或者(更好)使用matches.resize(m) @nneonneo 是的 m 小于 15000,在我的代码中是 matches.resize(m),但为了清楚起见,我在这里替换了它。 如果这不是构建问题,那么即使没有额外的成员,程序也很可能存在问题,而额外的成员只是通过使其崩溃而使问题更加明显。如果可以,请使用 valgrind 帮助了解真正的问题。 @nneonneo 我如何重建 Eclipse 中的所有内容? 【参考方案1】:

如果您更改结构定义,如果您的构建工具没有自动重新构建所有受影响的源文件,那么您应该重新构建所有受影响的源文件。否则,您可能会将使用不同结构定义的模块链接在一起,这将导致令人困惑的错误(如您所见)。

【讨论】:

以上是关于向现有结构添加元素会使函数在分段错误时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

C++ 向数组添加元素

向结构成员添加值时出现结构分段错误

链表中的分段错误

iOS 9.0 以下的分段控件 addTarget() 崩溃应用

如何向 TypeScript/JSX 中的现有 HTML 元素添加属性?

使用 jq 向现有 JSON 数组添加新元素