【问题标题】:Why Does This Throw A Segmentation Fault?为什么这会引发分段错误?
【发布时间】:2015-11-23 00:33:21
【问题描述】:

为什么这会引发分段错误?我正在调试它,并将其范围缩小到 switch 语句中的群众分配,我应该如何去做呢?

这是我的代码:

#include <stdio.h>
#define MAX 100


struct cg {
    int x, y, mass;
};
struct cg masses[MAX];

int numberOfEntries;

int readin(void) {
    FILE *file;
    int massesRead, i, num, partRead = 0;
    file = fopen( "WeightData.txt", "r" );
    if( file == NULL ) {
        printf( "Error: can't open file.\n" );
        return 1;
    } else {
        while( fscanf( file, "%d", &num ) > 0) {
            switch(partRead){
                case 0:
                    masses[i].x = num;
                    partRead++;
                    continue;
                case 1:
                    masses[i].y = num;
                    partRead++;
                    continue;
                case 2:
                    masses[i].mass = num;
                    massesRead++;
                    partRead = 0;
                    i++;
                    continue;
            }
        }
    }
    fclose( file );
    numberOfEntries = massesRead;
    return massesRead;
}

void computecg(int n_masses) {
    int sum_of_xmass;
    int sum_of_ymass;
    int sum_of_mass;
    for(int i=0; i< numberOfEntries; i++){
        sum_of_xmass += (masses[i].x * masses[i].mass);
        sum_of_ymass += (masses[i].y * masses[i].mass);
        sum_of_mass += (masses[i].mass);
    }
    int cg_x = sum_of_xmass / sum_of_mass;
    int cg_y = sum_of_ymass / sum_of_mass;

    printf("X = %d Y = %d.",cg_x, cg_y);
}

int main() {
    int number;
    if((number = readin()) > 0){
        computecg(number);
    }
    return numberOfEntries;
}

【问题讨论】:

  • 您放置了您的代码,但您还没有解释您的代码究竟需要做什么。请阅读如何提问stackoverflow.com/help/how-to-ask 以及如何创建最小、完整和可验证的示例stackoverflow.com/help/mcve
  • 这一行:void computecg(int n_masses) { 有参数“n_masses”,但函数中没有使用该参数。
  • 这一行:while( fscanf( file, "%d", &amp;num ) &gt; 0) { 没有与正确的值进行比较。 (参见 fscanf() 的手册页)该行应该是:`while( fscanf( file, "%d", &num ) == 1) {
  • 在 'switch()' 案例中,1) 以 'break;' 结束每个案例不是“继续;”并为“partread”不是 0 或 1 或 2 时添加一个“默认”情况
  • 这种行:masses[i].x = num; 正在使用未初始化的变量 'i' 这种行:massesRead++; 正在使用未初始化的变量 'massesRead'。

标签: c segmentation-fault


【解决方案1】:

你这样写:

masses[i].x = num;

但之后:

int massesRead, i, num, partRead = 0;

您永远不会为i 分配值,因此很可能是一些比100 高得多的巨大垃圾编号,因此您超出了数组的范围并得到了段错误。

你有一个类似的问题,从不初始化massesRead,然后尝试做massesRead++;

要修复,您可以更改为:

int massesRead = 0, i = 0, num, partRead = 0;

【讨论】:

    【解决方案2】:

    您为质量分配的元素很可能比您定义的要多。在读取例程中打印出您的索引 i 并检查它是否大于 100。

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 2016-07-10
      • 2016-02-03
      • 2022-01-25
      相关资源
      最近更新 更多