【问题标题】:Void * as return type is giving int value and warning: Cvoid * 作为返回类型给出 int 值和警告:C
【发布时间】:2014-03-03 00:49:40
【问题描述】:

我正在实现自己的 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 出现段错误

我回来了:

    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);
    }

【问题讨论】:

  • 你能发布分配函数,或者至少是它的相关部分吗?

标签: int return compiler-warnings void-pointers


【解决方案1】:

检查你的 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。在int main() { 之前添加一行void* Mem_Alloc(int size); 可以解决问题。

【讨论】:

  • 返回类型为 void* void *Mem_Alloc(int size) {
  • @user1166419 mymain.c 的第 10 行是哪一行?
  • 9: int *p1; 10: p1 = (int *)Mem_Alloc(40879); @jingyu9575
  • @user1166419 你在调用之前声明了 Mem_Alloc 吗?我的意思是,你有没有一行: void* Mem_Alloc(int size);在第 10 行之前?
猜你喜欢
  • 2012-09-04
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 2016-06-29
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
相关资源
最近更新 更多