Указательный вопрос - PullRequest
0 голосов
/ 05 августа 2009

Хорошо, я прохожу через 2 уровня функций fun1 вызывает func2 вызывает func3. Я передаю указатель до конца, используя в основном int * ptr, на самом низком «уровне» стека вызовов у меня также есть другая функция, которая динамически выделяет память для массива int. На верхнем уровне (уровень func1) я всегда возвращаю нулевое значение для переданного указателя. Я проследил до func3 и выделенная память заполняется значениями, но когда стек вызовов раскручивается, func3 -> func2 вдруг указатель просто исчезает (0x0000_0000)? Я не понимаю, на уровне func3, я в основном говорю, что ptr = allocate_ptr_array, но от этого возврата он доходит до NULL! Несмотря на то, что я не освободил память, что происходит в мире? Я знаю, что мой вопрос сбивает с толку. Я наблюдал, как это происходит в отладчике, хотя

Ответы [ 3 ]

6 голосов
/ 05 августа 2009

Указатель в основном передается по значению. Вам нужно передать указатель на указатель (int ** p), чтобы вернуть память обратно во внешнюю функцию.

function1(int *p)
{
 p = //allocate memory using malloc
}

function2(int **p)
{
 *p = //allocate memory using malloc
}

function3()
{
 int *p;
 function1(p); 
// in this case pointer is passed by value. 
//The memory allocated will not be available in p after the function call function1.

int **p;
function2(&p); 
//in this case pointer to pointer p has been passed.
// P will have the memory allocated even after 
//the function call function1
}

}

2 голосов
/ 05 августа 2009

Чтобы подсветить ответ aJ (полностью правильный) с помощью некоторого кода:

void func1(void)
{
    int *int_array;

    func2(&int_array);

    /* Some stuff using int_array[0] etc */

    /* ... */

    free(int_array);
}

void func2(int **a)
{
     /* ... stuff ... */

     func3(a);

     /* .... stuff ... */
}

void func3(int **a)
{
    (*a) = malloc(N * sizeof **a);
}
0 голосов
/ 05 августа 2009

Вот хороший пример для дальнейшего использования другими людьми. Это имеет смысл после внедрения и благодаря этим ребятам.

#include <memory.h>
#include <stdlib.h>
#include <stdio.h>

void func3(int **ptr)
{
    int i;
    (*ptr) = (int *)malloc(25*sizeof(int));

    for (i=0; i < 25; i++) (**ptr) = i;
    printf("func3: %d\n",ptr);
}

void func2(int **ptr)
{
    func3(ptr);
    printf("func2: %d\n", ptr);
}
void func1(void)
{
    int *ptr;
    printf("ptr before: %d\n", ptr);
    func2(&ptr);
    printf("ptr after: %d\n", ptr);
}

void func4(int **ptr)
{
    static int stuff[25];
    printf("stuff: %d\n",stuff);
    *ptr = stuff;
}

int main(void)
{
    int *painter;
    func1();
    func4(&painter);
    printf("painter: %d\n", painter);
    return 0;
}
...