不兼容的指针类型警告

时间:2012-03-23 13:28:49

标签: c pointers void-pointers

我有一个类似下面的C程序。我正在尝试使用签名mallocint myAlloc()之上编写一个包装器。这个包装器应该在成功的内存分配时返回1,或者如果内存分配失败则返回0。

#include <stdio.h>
#include <stdlib.h>

int myAlloc(void **ptr, int size)
{
    *ptr = malloc(size);

    if (!ptr)
        return 0;
    else
        return 1;
}

void main()
{
    int *p = NULL;
    myAlloc(&p, sizeof(int));
    printf("%d\n", *p);
}

当我编译它时,我收到一条警告“不兼容的指针类型”。如何在不接收警告的情况下使用任何可能的指针类型调用此函数?

是否可以从实际函数调用中删除转换操作?

更新

我找到了答案。这是更正后的代码:

#include <stdio.h>
#include <stdlib.h>

int myAlloc(void *ptr,int size)
{
    *(void **)ptr = malloc(size);

    if (!ptr)
        return 0;
    else
        return 1;

}

int main()
{
    int *p = NULL;
    myAlloc(&p, sizeof(int));
    *p = 5;
    printf("%d\n", *p);

    return 1;
}

9 个答案:

答案 0 :(得分:4)

你的函数,myMalloc获取指向void的指针,或void**你传递指向int的指针的地址,或int**

你需要将你传递的指针强制为无效,例如

myAlloc((void**)&p,sizeof(int));

答案 1 :(得分:0)

我看到的实际错误 - 可能与您的错误不同;我们无法知道,因为你忽略了向我们展示实际输出 - 看起来像这样:

src.c: In function ‘main’:
src.c:15:17: warning: passing argument 1 of ‘myAlloc’ from incompatible pointer type [enabled by default]
src.c:4:5: note: expected ‘void **’ but argument is of type ‘int **’

您正在将myAlloc函数传递给int **变量,但您的函数将被编写为接受void **变量。您可以在函数调用中强制转换指针类型,如下所示:

myAlloc((void **)&p,sizeof(int));

现在它在没有警告的情况下编译。

您可能需要阅读pointersThe C Book部分,尤其是第5.3.5节,该部分明确解决了此处提出的一些问题。

答案 2 :(得分:0)

这在学术上看起来很有趣,但是包装器中的内部代码是不是在进行相同类型的布尔检查?

void *ptr;
if( (ptr = malloc(1000)) )
{
  /* Do stuff with ptr */
}
else
{
  /* throw a tantrum */
}

你真的需要带有额外参数复杂度的int返回码吗?

答案 3 :(得分:0)

在C中,一般指针有一个void*类型,但是没有一个指向指针的通用指针的类型。更糟糕的是,不同类型指针的大小可能不相等。因此,如果你的函数不知道它应该分配什么类型的指针,它不能只是“将数据放在地址中”,因为右指针的大小可能与它指定的指针的大小不同。

例如,如果sizeof(int*)<sizeof(void*),您的代码可能会崩溃(并且是UB)。

因此,我认为编写一个你想要的包装器是不可能的。

答案 4 :(得分:0)

无法在符合标准的C中编写此类函数,因为int *void *不兼容。

(大多数)等效的宏定义可能如下所示:

#define myAlloc(PTR, SIZE) (!!(PTR = malloc(SIZE)))

答案 5 :(得分:0)

#include <stdio.h>
#include <stdlib.h>

int myAlloc(void *ptr,int size)
{
    *(void **)ptr=malloc(size);
    if(!ptr) return 0;
    else return 1;

}

int main()
{
    int *p=NULL;
    myAlloc(&p,sizeof(int));
    *p=5;
    printf("%d\n",*p);
    return 1;
}

答案 6 :(得分:-1)

pint*类型,而您的函数接受void**

myAlloc((void **)&p,sizeof(int));

答案 7 :(得分:-1)

根据myAlloc的签名,你应该用myAlloc((void**)&p,sizeof(int))来调用它,因为p是int*(ptr到int)而不是void*(ptr到void)。

答案 8 :(得分:-2)

OR:您的代码中存在错误。你可能想要:

   if(!(*ptr)) return 0;