以下代码出现问题

时间:2011-05-28 17:46:45

标签: c

我想知道下面提供的代码存在的问题。我似乎遇到了分段错误。

void mallocfn(void *mem, int size)
{
    mem = malloc(size);
}

int main()
{
    int *ptr = NULL;
    mallocfn(ptr, sizeof(ptr));
    *ptr = 3;

    return;
}

4 个答案:

答案 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 *转换为右指针类型。