我想知道下面提供的代码存在的问题。我似乎遇到了分段错误。
void mallocfn(void *mem, int size)
{
mem = malloc(size);
}
int main()
{
int *ptr = NULL;
mallocfn(ptr, sizeof(ptr));
*ptr = 3;
return;
}
答案 0 :(得分:3)
假设你的示例中包含malloc的包装器在你的示例中被错误命名(你在main(...)函数中使用AllocateMemory
) - 所以我认为你调用malloc的函数实际上是{ {1}},您通过值传入指针,将此参数值设置为malloc的结果,但是当函数返回时,传入的指针将不会更改。 / p>
AllocateMemory
答案 1 :(得分:3)
应该是这样的:
<击> void mallocfn(void **mem, int size)
击>
void mallocfn(int **mem, int size)
{
*mem = malloc(size);
}
int main()
{
int *ptr = NULL;
mallocfn(&ptr, sizeof(ptr));
*ptr = 3;
return;
}
因为您需要编辑p
的内容而不是指向b p
的内容,所以您需要发送指针变量p
的地址到分配功能。
同时查看@Will A的回答
答案 2 :(得分:1)
保持你的榜样,正确使用malloc
看起来更像是这样:
#include <stdlib.h>
int main()
{
int *ptr = NULL;
ptr = malloc(sizeof(int));
if (ptr != NULL)
{
*ptr = 3;
free(ptr);
}
return 0;
}
如果您正在学习C,我建议您更加自我激励,阅读错误信息并自己得出结论。让我们解析一下:
prog.c:1: warning: conflicting types for built-in function ‘malloc’
malloc
是一个标准函数,我猜gcc
已经知道它是如何声明的,将其视为“内置”。通常,在使用标准库函数时,您需要#include
正确的标题。您可以根据文档(man malloc
)找出哪个标题。
在C ++中,您可以使用不同的参数声明与现有函数同名的函数。 C不会让你这样做,因此编译器会抱怨。
prog.c:3: warning: passing argument 1 of ‘malloc’ makes pointer from integer without a cast
prog.c:3: error: too few arguments to function ‘malloc’
你的malloc
正在呼唤自己。你说第一个参数是void*
,它有两个参数。现在你用整数调用它。
prog.c:8: error: ‘NULL’ undeclared (first use in this function)
NULL
在标准标头中声明,而您没有#include
。
prog.c:9: warning: implicit declaration of function ‘AllocateMemory’
你刚刚调用了函数AllocateMemory
,没有告诉编译器它应该是什么样子。 (或提供实现,这将创建链接器错误。)
prog.c:12: warning: ‘return’ with no value, in function returning non-void
你说main会返回int
(应该如此),但你只是说return;
没有值。
答案 3 :(得分:1)
放弃这整个成语。如果没有为您可能想要分配的每种类型的对象创建单独的分配函数,则无法在C中执行此操作。而是按照预期的方式使用malloc
- 指针在返回值中返回给您。这样,它会在分配时自动从void *
转换为右指针类型。