我的智慧结束了这个代码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整数那么必须在堆中分配 - 那个只有错误花了很长时间才弄清楚。)
答案 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,它将位于堆栈中。所以,你可能会遇到问题,因为堆栈只能这么大。应该从堆中分配大型数组。