我有一个类似下面的C程序。我正在尝试使用签名malloc
在int 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;
}
答案 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));
现在它在没有警告的情况下编译。
您可能需要阅读pointers的The 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)
p
是int*
类型,而您的函数接受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;