一些启动器:
创建一个称为fractions的数据结构的动态数组。Fractions具有设置、打印、打印等功能。
我不断地得到一个双重释放或损坏的错误,以及内存映射中的许多胡言乱语。这是来自输出的错误:
双自由或损坏(顶部):0x0000000001976010*
我知道它被释放/删除了两次,但这是产生错误的代码:
#include <stdio.h>
#include <stdlib.h>
#include "fraction.h"
main() {
long long int size = 0;
long long int capacity = 10;
int FSize = sizeof(struct fraction);
struct fraction* array = NULL;
struct fraction in;
array = (struct fraction*)malloc(FSize * capacity);
if (array == NULL) {
printf("MALLOC DID NOT WORKn");
exit(1);
}
int i = 0;
for (i = 0; i < 17; i++) {
if (size == capacity) {
capacity = capacity * 2;
struct fraction* temp = NULL;
temp = (struct fraction*)realloc(array, FSize * capacity);
// free(array);
array = temp;
free(temp);
}
SetFrac(&in);
array[size++] = in;
}
printf("IT MADE IT HERE >>>>>>>>>>>>>>>>>> n");
getchar();
for (i = 0; i < size; i++) {
struct fraction t = array[i];
PrintFrac(&t);
}
free(array);
return 0;
}
这是的工作代码
#include <stdio.h>
#include <stdlib.h>
#include "fraction.h"
main() {
long long int size = 0;
long long int capacity = 10;
int FSize = sizeof(struct fraction);
struct fraction* array = NULL;
struct fraction in;
array = (struct fraction*)malloc(FSize * capacity);
if (array == NULL) {
printf("MALLOC DID NOT WORKn");
exit(1);
}
int i = 0;
for (i = 0; i < 17; i++) {
if (size == capacity) {
capacity = capacity * 2;
struct fraction* temp = NULL;
temp = (struct fraction*)realloc(array, FSize * capacity);
// free(array);
array = temp;
free(temp);
}
SetFrac(&in);
array[size++] = in;
}
printf("IT MADE IT HERE >>>>>>>>>>>>>>>>>> n");
getchar();
for (i = 0; i < size; i++) {
struct fraction t = array[i];
PrintFrac(&t);
}
// free(array);
return 0;
}
我是不是用错了free()函数?
数组和temp具有相同的指针地址,因此当您释放temp时,数组也将被释放
您应该只在末尾释放"array"。您不能释放"temp",因为您将继续使用块(array = temp
不维护特定的"引用计数",而只是分配一个指针)。
调用free
后,不应该取消引用释放的内存,这是通过使用array[size++]
来完成的。
您不应该在那里的临时free()
,因为您稍后将使用array
。
您最后注释掉的free()
将是唯一正确的,尽管程序应该在没有它的情况下运行良好。
您不需要在realloc-temp之后释放(temp),只需要释放(数组)main的末尾。如果你realloc是成功的,有两种可能性:
- temp==数组(指向同一内存的temp)
- 数组是空闲的,临时指向新内存