Void *作为返回类型给出int值和警告:C

时间:2014-03-03 00:49:40

标签: int return compiler-warnings void-pointers

我正在实现我自己的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);
    }

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() {可以解决问题。