亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C編程:malloc()在另一個函數中

C編程:malloc()在另一個函數中

C C++
30秒到達戰場 2019-07-02 16:38:15
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
查看完整描述

3 回答

?
BIG陽

TA貢獻1859條經驗 獲得超6個贊

您需要將指向指針的指針作為參數傳遞給您的函數。

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; }


查看完整回答
反對 回復 2019-07-02
?
慕田峪9158850

TA貢獻1794條經驗 獲得超8個贊

如何將指針傳遞到函數并從調用函數內部為傳遞的指針分配內存?

捫心自問:如果您必須編寫一個必須返回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(...);}


查看完整回答
反對 回復 2019-07-02
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

如果您希望您的函數修改指針本身,則需要將其作為指針傳遞給指針。下面是一個簡化的示例:

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);}


查看完整回答
反對 回復 2019-07-02
  • 3 回答
  • 0 關注
  • 809 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號