猿问

C编程:malloc()在另一个函数中

C编程:malloc()在另一个函数中

我需要帮助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;}

程序输出:

Point1: Memory allocated ptr: 262144 bytesPoint2: Memory allocated input_image: 0 bytes


30秒到达战场
浏览 743回答 3
3回答

BIG阳

您需要将指向指针的指针作为参数传递给您的函数。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; }

慕田峪9158850

如何将指针传递到函数并从调用函数内部为传递的指针分配内存?扪心自问:如果您必须编写一个必须返回int你会怎么做?要么直接返回:int foo(void){     return 42;}的级别,或者通过输出参数返回它。间接(即,使用int*而不是int):void foo(int* out){     assert(out != NULL);     *out = 42;}所以当您返回指针类型时(T*),这是相同的:要么直接返回指针类型:T* foo(void){     T* p = malloc(...);     return p;}或者添加一个间接级别:void foo(T** out){     assert(out != NULL);     *out = malloc(...);}

aluckdog

如果您希望您的函数修改指针本身,则需要将其作为指针传递给指针。下面是一个简化的示例: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);}
随时随地看视频慕课网APP
我要回答