返回0时发出SIGABRT信号

时间:2015-07-10 02:43:13

标签: c pointers sigabrt

除非我的程序尝试返回0时出现错误,否则一切似乎都运行正常:

Thread_1: signal SIGABRT

我不确定我做错了什么,但我认为可能是我如何使用我的指针(通过引用传递一组双打)。我相信它与我的记忆被释放有关,我有点新,所以很难搞清楚这一点。谢谢!

编辑:readGrades()从文本文件input.txt中读取4个整数,并将它们添加到传入的数组中

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/*
 * readGrades()
 * INPUT:  double array of grades (double grades[])
 * OUTPUT: number of grades read (int numOfGradesRead)
 */
int readGrades(double (*grades)[]) {

int numOfGradesRead = 0,
    count = 0,
    numRead;

char buf[1000];
FILE *file = fopen("input.txt", "r");

if (file == NULL) {
    perror("Can't open file");
} else {
    while (fgets(buf, sizeof(buf), file)) {

        // Convert buf to integer
        numRead = atoi(buf);

        // Add number read to grades[]
        if (numRead != -999) {
            (*grades)[count] = numRead;
            numOfGradesRead++;
            count++;
        }
    }
}

fclose(file);

return numOfGradesRead;
}

void frequency(double grades[], int numOfGrades) {

}

int main() {

double grades[100];
int i;

// Initialize grades values to 0
for (i = 0; i < sizeof(grades)/sizeof(int); i++) {
    grades[i] = 0;
}

int numOfGradesRead = readGrades(&grades);

for (i = 0; i < 4; i++) {
    printf("%f", grades[i]);
}

return 0;
}

1 个答案:

答案 0 :(得分:4)

主要错误是行:

for (i = 0; i < sizeof(grades)/sizeof(int); i++) {

由于该错误,您使用超出范围的索引设置grades元素的值,这会导致未定义的行为。

应该是

for (i = 0; i < sizeof(grades)/sizeof(double); i++) {
                                   // ^^^^^^^ Needs to be double not int

您可以使用惯例

for (i = 0; i < sizeof(grades)/sizeof(grades[0]); i++) {

让你的代码更健壮。

此外,您可能希望使用4,而不是使用for循环中的硬编码数numOfGradesRead来打印成绩。此外,在等级之间打印空格或换行符以使输出更易于阅读。

for (i = 0; i < numOfGradesRead; i++) {
    printf("%f\n", grades[i]);
}