C编程:另一个函数里面的malloc()

Hag*_*ble 61 c malloc pointers function

我需要帮助malloc() 内部另一个功能.

我正在向我的函数传递一个指针大小main(),我想malloc()从被调用的函数内部动态地为该指针分配内存,但我看到的是......正在分配的内存是对于在我调用的函数内声明的指针,而不是指向内部的指针main().

我应该如何传递指向函数的指针并为被调用函数内部传递的指针分配内存?


我写了下面的代码,得到如下所示的输出.

资源:

int main()
{
   unsigned char *input_image;
   unsigned int bmp_image_size = 262144;

   if(alloc_pixels(input_image, bmp_image_size)==NULL)
     printf("\nPoint2: Memory allocated: %d bytes",_msize(input_image));
   else
     printf("\nPoint3: Memory not allocated");     
   return 0;
}

signed char alloc_pixels(unsigned char *ptr, unsigned int size)
{
    signed char status = NO_ERROR;
    ptr = NULL;

    ptr = (unsigned char*)malloc(size);

    if(ptr== NULL)
    {
        status = ERROR;
        free(ptr);
        printf("\nERROR: Memory allocation did not complete successfully!");
    }

    printf("\nPoint1: Memory allocated: %d bytes",_msize(ptr));

    return status;
}
Run Code Online (Sandbox Code Playgroud)

计划产出:

Point1: Memory allocated ptr: 262144 bytes
Point2: Memory allocated input_image: 0 bytes
Run Code Online (Sandbox Code Playgroud)

jam*_*lin 91

我应该如何传递指向函数的指针并为被调用函数内部传递的指针分配内存?

问问自己:如果你必须编写一个必须返回的函数int,你会怎么做?

你要么直接退货:

int foo(void)
{
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

或者通过添加间接级别(即使用int*替代int)来通过输出参数返回它:

void foo(int* out)
{
    assert(out != NULL);
    *out = 42;
}
Run Code Online (Sandbox Code Playgroud)

所以当你返回一个指针类型(T*)时,它是一样的:你要么直接返回指针类型:

T* foo(void)
{
    T* p = malloc(...);
    return p;
}
Run Code Online (Sandbox Code Playgroud)

或者你添加一个间接级别:

void foo(T** out)
{
    assert(out != NULL);
    *out = malloc(...);
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你给我的解释,我太急于提供. (3认同)
  • @Pinyaka:调用者在结果指针上调用`free()`是安全的(调用者如何释放分配的内存?).但是,调用者要么执行`T*out = foo();`(在第一种形式中)或`T*out; foo(&out);`(以第二种形式).在这两种情况下,调用者都必须调用`free(out)`,而不是`free(*out)`. (2认同)

Mar*_*som 73

您需要将指针传递给指针作为函数的参数.

int main()
{
   unsigned char *input_image;
   unsigned int bmp_image_size = 262144;

   if(alloc_pixels(&input_image, bmp_image_size) == NO_ERROR)
     printf("\nPoint2: Memory allocated: %d bytes",_msize(input_image));
   else
     printf("\nPoint3: Memory not allocated");     
   return 0;
}

signed char alloc_pixels(unsigned char **ptr, unsigned int size) 
{ 
    signed char status = NO_ERROR; 
    *ptr = NULL; 

    *ptr = (unsigned char*)malloc(size); 

    if(*ptr== NULL) 
    {
        status = ERROR; 
        free(*ptr);      /* this line is completely redundant */
        printf("\nERROR: Memory allocation did not complete successfully!"); 
    } 

    printf("\nPoint1: Memory allocated: %d bytes",_msize(*ptr)); 

    return status; 
} 
Run Code Online (Sandbox Code Playgroud)

  • <S>为什么在一个保证有NULL指针的条件代码块中自由调用!?!?</ S>`free(*ptr)`将从`main()`调用时尝试释放` input_image`这是嗯,这个词逃避了我......没有动态分配. (5认同)
  • @James Morris,我只是复制了问题中发布的代码并进行了最少的更改。我不想被主要观点分心。 (2认同)

Mat*_*nen 8

如果希望函数修改指针本身,则需要将其作为指针传递给指针.这是一个简化的例子:

void allocate_memory(char **ptr, size_t size) {
    void *memory = malloc(size);
    if (memory == NULL) {
        // ...error handling (btw, there's no need to call free() on a null pointer. It doesn't do anything.)
    }

    *ptr = (char *)memory;
}

int main() {
   char *data;
   allocate_memory(&data, 16);
}
Run Code Online (Sandbox Code Playgroud)