我正在实现我自己的malloc,并面临一个小问题,即void *
当我在mem_alloc中打印返回的地址时:
printf("Addr p = %p\n", (void *)(p+ 1));
它给我这样的东西:
Addr p = 0x7f20f20b1050
但是当我在mymain.c中打印相同的返回指针时:
p1 = (int *)Mem_Alloc(40879);
printf("%p\n", p1);
我得到:0xfffffffff20b1050 这导致我的mem_free
中的seg错误我回来了:
return (void *)(p + 1);
我也收到了mymain.c的警告:mymain.c:10:警告:从不同大小的整数转换为指针
我不明白的是当我返回void *
时它为什么变成整数类型 for (p = freep; p != NULL; prevp = p, p = p->ptr) {
if (p->size == size) {
if (prevp == NULL) {
freep = p->ptr;
} else {
prevp->ptr = p->ptr;
}
} else if (p->size > size) {
p->size = p->size - size;
p = (Header *)((char *)p + p->size);
p->size = size;
} else {
continue;
}
printf("Addr p = %p\n", (void *)(p+ 1));
return (void *)(p+1);
}
答案 0 :(得分:0)
检查Mem_Alloc的返回类型:
int Mem_Alloc(int size);
无论你在上面的函数中返回什么,都将被转换为int。
编辑:
以下代码:
/* main.c */
#include <stdio.h>
int main() {
int *p1;
p1 = (int *)Mem_Alloc(40879);
printf("%p\n", p1);
}
/* mem_malloc.c */
void* Mem_Alloc(int size) {
return (void*)0x7f20f20b1050;
}
在我的Windows 8.1 / Visual Studio 2013(x64)上显示FFFFFFFFF20B1050
,因为如果在调用Mem_Alloc之前未声明它,its return type will implicitly be int
。在void* Mem_Alloc(int size);
之前添加一行int main() {
可以解决问题。