我正在使用自定义malloc并在C中自由实现。我的代码工作得很好,但并不完美。在我测试my_malloc和my_free的文件中,我调用了my_malloc 3次。它适用于前2个呼叫,但不适用于第3个呼叫。一切都完全一样,所以我真的不知道为什么它不能再工作了。我知道堆里有足够的内存,所以不是那样的。它甚至可以返回指针变量的地址,但测试文件不会写入它。
这里有一些代码来测试my_malloc和my_free,它打破了c:
static int *base;
static int *heap_end;
int total_mem_used = 0;
int first_call = 1;
int i;
int *a, *b, *c;
if ((a=(int *)my_malloc(10))==NULL)
return MALLOC_FAIL;
for (i=0;i<10;i++)
a[i] = i;
for (i=0;i<10;i++)
printf("%d\n", a[i]);
if ((b=(int *)my_malloc(18))==NULL)
return MALLOC_FAIL;
for (i=0;i<18;i++)
b[i] = i*i;
for (i = 0; i < 18; i++)
printf("%d ", b[i]);
printf("\n");
if ((c=(int *)my_malloc(5))==NULL)
return MALLOC_FAIL;
for (i=0;i<5;i++)
c[i] = i*7;
这里也是my_malloc,如果它有帮助:
void *p;
int *t;
int data_size, block;
if (size==0)
return NULL;
if (first_call) {
if ((base=(int *)malloc(HEAP_SIZE))==NULL)
return NULL;
init_heap(norm_size(size)+8);
heap_end = &base[HEAP_SIZE];
first_call = 0;
total_mem_used += (norm_size(size)+2);
t = base;
return (void *) (t+2);
}
data_size = norm_size(size);
block = data_size + 2;
p = find_first_free(block);
if (p==0) {
errno = ENOMEM;
return NULL;
}
total_mem_used += block;
fill_header((int *) p, block);
t = (int *) p + 2;
return (void *) t;
void my_free(void *p) {
int *t;
t = (int *) p - 2;
*t = *t & -2;
coalesce(t);
}
void *find_first_free(int n) {
int *p;
p = base;
while (p<heap_end && ((*p & 1) || (*p <= n)))
p = p + (*p & -2);
return (void *)p;
}
int norm_size(int w) {
if (w % 8 == 0)
return w;
else
return w + (8 - w % 8);
}
void init_heap(int n) {
base[0] = n+1; // n+1 since we're allocating it
base[1] = (int) &base[n];
base[n-1] = n+1;
base[n] = HEAP_SIZE - n;
base[HEAP_SIZE-1] = HEAP_SIZE - n;
}
void fill_header(int *p, int w) {
p[0] = w+1;
p[1] = (int) &p[w];
p[w-1] = w+1;
p[w] = HEAP_SIZE - total_mem_used;
p[w+HEAP_SIZE-total_mem_used-1] = HEAP_SIZE - total_mem_used;
}
知道程序到底出了什么问题吗?谢谢你的帮助。
答案 0 :(得分:0)
避免使用魔术数字
block = data_size + 2;
为什么2?为什么不是16或256?当然,添加是为了节省大小。在这种情况下,请添加int
。
block = data_size + sizeof(int);
t = (int *) p + 2;
为什么2与任何其他数字?同样,这样做是为了考虑在p
保存的大小开始。但这不像以前那样是整数加法。这是“指针添加”。使用+ 2
时,p
会增加2 * sizeof(int)
。可能的代码应该是
t = p + 1;
这是“无魔数”规则的例外:-1,0,+ 1都可以
要回答更多问题,请发布完整的功能。
轻微:不需要施放
// if ((base=(int *)malloc(HEAP_SIZE))==NULL)
if ((base = malloc(HEAP_SIZE)) == NULL)
Minor:考虑无符号类型size_t
。这是函数/运算符返回的类型,如strlen()
,sizeof()
// int data_size
size_t data_size
// if ((a=(int *)my_malloc(10))==NULL)
a = my_malloc(10);
if (a == NULL)
init_heap(norm_size(size)+8);
为什么8?使用常量/定义
#define MY_MALLOC_GUARD (8)
init_heap(norm_size(size) + MY_MALLOC_GUARD);