2016-02-03 3 views
0

Во-первых, это может звучать нормально, если я освобожу выделение внутри функции, но это не так. Поскольку я пишу эти строки, я нашел работу вокруг, но я хотел бы сохранить определенную однородность в моем коде и предпочел бы сохранить ее так, как она есть, но вы знаете, что работаете правильно, так что есть еще одно решение или Мое обходное решение - единственный вариант?C: двойной указатель передается как параметры возвращается

Основная функция:

void main(void) 
{ 
    SHead head; // Custom struct 
    unsigned char **array = NULL; // pointer to 2D array 

    allocArray2D(&head, array) // the function signature: (SHead*, unsigned char**) 

    // here, the array pointer is still NULL (0x0) 
    //... 

    return EXIT_SUCCESS; 
} 

Распределение функции таНос очень небольшой объем памяти около 21 беззнаковое символ * и для каждого простого указателя 21 беззнаковых символов. Внутри функции указатель в порядке и указывает на правильный адрес.

Так что моя работа была вокруг изменить функцию от:

void allocArray(SHead* h, unsigned char** arr) 
{ 
    int x, y, i; 
    getsize(head, *x, *y); 

    arr = (unsigned char**)malloc(sizeof(unsigned char*)*y); 
    if(arr) 
     printf(">> Erro allocating memory\n"), return; 

    for(i =0; i<y; i++) 
    { 
     arr[i] = (unsigned char)malloc(sizeof(unsigned char)*x); 
    } 
} 

к следующему:

unsigned char** allocArray(SHead*) 
{ 
    int x, y, i; 
    unsigned char **arr; 
    getsize(head, *x, *y); 

    arr = (unsigned char**)malloc(sizeof(unsigned char*)*y); 
    if(arr) 
     printf(">> Erro allocating memory\n"), return; 

    for(i =0; i<y; i++) 
    { 
     arr[i] = (unsigned char)malloc(sizeof(unsigned char)*x); 
    } 

    return arr; // returning the address 
} 

Как я уже говорил ранее, я хотел бы сохранить гомогенность в моем коде и предпочел бы чтобы сохранить подпись функции, аналогичную другой функции. Мое обходное решение работает правильно. И мне интересно, является ли это единственным решением, или, может быть, я что-то упускаю.

EDIT: После комментариев я добавил еще код.

Спасибо, Alex.

+3

не должно быть 'allocArray2D (& head, array);' или это опечатка? –

+1

Пожалуйста, покажите функцию 'allocArray2D'. –

+1

Обеспечьте [mcve]. '* head' выглядит очень неправильно. – Olaf

ответ

0

Вы должны передать указатель на 2dimensional массив вашей функции, писать в функции значения за указателем:

SHead head; // Custom struct 
unsigned char **array = NULL; // pointer to 2D array 

allocArray2D(*head, &array) 
       //^address of array 

-

void allocArray(SHead* head, unsigned char*** pArray) 
            //^pointer to char** because its an output parameter 
{ 
    int x, y, i; 
    getsize(head, &x, &y); 

    *pArray = malloc(y * sizeof(unsigned char *); 
//^assigne somtething to the variable array refered by the pointer pArray 
    if(*pArray == NULL) 
    { 
     printf(">> Erro allocating memory\n") 
     return; 
    } 

    for (i = 0; i < y; i ++) 
     (*pArray)[i] = malloc(x * sizeof(unsigned char)); 
} 

Примечание, что вы сделали должен был передать NULL -pointe функции allocArray.

Другим решением было бы вернуть выделенную память возвращаемым значением функции allocArray:

SHead head; // Custom struct 
unsigned char **array = NULL; 

array = allocArray(&head); 

-

unsigned char** allocArray(SHead* head) 
{ 
    int x, y, i; 
    getsize(head, &x, &y); 

    unsigned char** arr = malloc(y * sizeof(unsigned char *); 
    if(arr == NULL) 
    { 
     printf(">> Erro allocating memory\n") 
     return; 
    } 

    for (int i = 0; i < y; i ++) 
     arr[i] = malloc(x * sizeof(unsigned char)); 
    return arr; 
} 
+0

Спасибо, теперь я понимаю, почему. –

0

Если я правильно понял, что вам нужно, это примерно следующее: Для простоты я исключил параметр, относящийся к структуре.

void allocArray2D(unsigned char ***a, size_t n) 
{ 
    *a = malloc(n * sizeof(unsigned char *)); 

    for (size_t i = 0; i < n; i++) (*a)[i] = malloc(n * sizeof(unsigned char)); 
} 

//... 

unsigned char **array = NULL; // pointer to 2D array 

allocArray2D(&array, 21); 

Если вы хотите, чтобы исходный объект был изменен после передачи его функции, вам необходимо передать его по ссылке.

0

Ваш звонок выглядит очень странно.

Во-первых, вы проходите * голова. голова кажется неинициализированной переменной, поэтому проходящая головка кажется плохой ошибкой.

Во-вторых, вызываемая функция не имеет способа увидеть массив. Ваш вызов эквивалентен allocArray2D (* head, NULL) и не имеет переменной массива вообще. Это также кажется очень неправильным.

Смежные вопросы