int指针不会返回,触发SIGABRT

时间:2015-07-20 04:49:05

标签: c pointers

我的智慧结束了这个代码X(我似乎无法弄清楚为什么我的代码中的指针intarray不会返回并触发SIGABRT ......指针似乎已被赋值为0x0000000100400000,所以我不知道为什么代码不会返回该值... 这是我的数组生成函数的相关代码,以及我使用的结构和使用它的main()部分:

struct ArrAndInv {
    int *array;
    long inversionCount;
};


int * arrayGenerator(FILE *file, int size_of_array) {
    int *intarray = malloc(size_of_array * sizeof(int));
    char num[8];
    char c = '\0';
    int addnumber;
    int i;
    int j;

    for (i=0; i < size_of_array; i++) {
        for (j=0; j < 8; j++) {
            c = fgetc(file);
            if (c != EOF && c != '\n') {
                num[j] = c;
            }
            else {
                break;
            }
        }
        num[j+1] = '\0';
        addnumber = atoi(num);
        for (j = 0; j < 8; j++) {
            num[j] = '\0';
        }
        intarray[i] = addnumber;
        if (c == EOF) {
            break;
        }
    }
    return intarray;
}


int main() {
    struct ArrAndInv arya;
    FILE *integerarray = fopen("/Users/MyName/Desktop/IntegerArray.txt", "r");
    int arraysize = 100000;

    // Some more code

    rewind(integerarray);
    arya.array = malloc(arraysize * sizeof(int));
    arya.array = arrayGenerator(integerarray, arraysize);

    // More code
}

我即将崩溃,因为这段代码充满了恼人的小技术问题(就像我不知道如果整数数组是100000整数那么必须在堆中分配 - 那个只有错误花了很长时间才弄清楚。)

2 个答案:

答案 0 :(得分:1)

char num[8];
...
for (j=0; j < 8; j++) {
...
}
num[j+1] = '\0';

如果该循环运行7或8次,则以下语句将超出num的范围。根据堆栈的布局,这可能会破坏指针或导致问题。

答案 1 :(得分:0)

我假设这是在Linux上,因为你获得了SIGABRT?

首先,如果您正在收集8位ASCII数字并使用atoi处理结果字符串,则需要将数组num声明为9(char num [9]),这样您就可以保持8位数字以及null终止符。您可能会收到此错误,因为您将超过堆栈变量的数组范围。

虽然我们正在使用它,但更好的做法可能是使用fscanf而不是从文件中单独读取每个字符:

fscanf(file, "%ld\n", &addnumber);

其次,如果您最初在函数中本地分配了intarray,它将位于堆栈中。所以,你可能会遇到问题,因为堆栈只能这么大。应该从堆中分配大型数组。