一些先发者:
创建一个名为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 WORK\n");
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 WORK\n");
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()函数错了吗?
答案 0 :(得分:1)
array和temp具有相同的指针地址,因此当你释放temp时,数组也将被释放
答案 1 :(得分:0)
你应该只免费&#34;阵列&#34;在末尾。你不能免费使用&#34; temp&#34;,因为你将继续使用该块(array = temp
不保持某个&#34;引用计数&#34;,但只是指定一个指针)
答案 2 :(得分:0)
调用free
后,您不应使用array[size++]
取消引用正在执行的已释放内存。
你不应该在那里free()
,因为你以后使用的是array
。
你的最终评论free()
将是唯一一个正确的,虽然程序运行正常但没有。
答案 3 :(得分:0)
你不需要在realloc temp之后释放(temp),只是为了释放(数组)main的结尾。如果你realloc成功,有两种可能: