我正在研究一组40位数字并制作一个斐波那契序列,基本情况是这40个数字集合中的两个。如果我只使用int而没有动态内存的指针,它工作正常,但是当我实际使用Int40结构,它只是一个带有int *数字的结构时,我得到这个线程错误。我不知道这意味着什么,我已尝试用其他问题调查,但没有一个有用。谁能帮我?错误发生在第6行,使用ans->数字malloc
感谢您抽出宝贵时间!
Int40 *fibKw26(int n, Int40 *first, Int40 *second) {
int count = 0;
Int40 *arr = malloc(sizeof(Int40) * 3);
if (count != n) {
Int40 *ans = malloc(sizeof(Int40));
ans->digits = malloc(sizeof(int) * 40);
arr[0] = *first;
arr[1] = *second;
int x[40];
int y[40];
int m = 0;
if (ans == NULL) {
printf("Malloc error\n");
exit(-1);
}
if (ans->digits == NULL) {
printf("Malloc error\n");
exit(-1);
}
for (m = 39; m >= 0; m--) {
x[m] = first->digits[m];
}
for (m = 39; m >= 0; m--) {
y[m] = second->digits[m];
}
int temp = 0;
int carryout = 0;
int carryin = 0;
for (m = 39; m >= 0; m--) {
//printf("%d + %d = ", x[m], y[m]);
temp = x[m] + y[m];
if (carryout == 1) {
carryin = 1;
}
if (temp >= 16) {
//printf(" equal or greater than 16 ");
temp = temp % 16;
carryout = 1;
if (carryin == 1) {
//printf(" carried in ");
temp++;
carryin = 0;
}
}
else {
carryout = 0;
if (carryin == 1) {
temp++;
//printf(" carried in ");
carryin = 0;
if (temp >= 16) {
temp = temp % 16;
carryout = 1;
}
}
}
ans->digits[m] = temp;
//printf("%d -- Carryout = %d\n", ans->digits[m], carryout);
}
arr[2] = *ans;
free(ans);
return fibKw26(n, &arr[1], &arr[2]);
}
else {
return &arr[3];
}
return NULL;
}
答案 0 :(得分:0)
我假设你的结构Int40是这样的:
typedef struct {
int digits[40];
}Int40;
如果是这种情况,请执行以下操作:
Int40 *ans = malloc(sizeof(Int40));
您实际上是为所有40个整数分配内存。所以这样做:
ans->digits = malloc(sizeof(int) * 40);
完全错误和不必要。还有一件事,假设代码会以某种方式工作:
Int40 *ans = malloc(sizeof(Int40));
ans->digits = malloc(sizeof(int) * 40);
arr[0] = *first;
arr[1] = *second;
int x[40];
int y[40];
int m = 0;
if (ans == NULL) {
printf("Malloc error\n");
exit(-1);
}
你正在使用第2行的ans指针,但是你正在测试它的代码为NULL ...这是错误的!
编辑:我看到的其他内容:arr[2] = *ans;
free(ans);
return fibKw26(n, &arr[1], &arr[2]);
您正在释放ans的内存,但是您尝试将指向该内存的指针传递给fibKw26函数。你使用arr的方式也是错误的。伙计,你的代码是一团糟。如果您不了解指针和内存分配/释放的工作原理,请更好地使用数组或坐下来学习。