массив realloc внутри функции

я пытаюсь перераспределить массив внутри функции.

unsigned findShlasa(int matrix[COL_MATRIX_A][ROW_MATRIX_A], Sa *ar, list head)
{
Node* current_pos;
unsigned count = 0;
unsigned row_index, col_index;


for (col_index = 0; col_index < COL_MATRIX_A; col_index++)
{
    for (row_index = 0; row_index < ROW_MATRIX_A; row_index++)
    {
        if ((row_index + col_index) == matrix[col_index][row_index])
        {
            if (!head)
            {
                ar = (Sa*) malloc(sizeof(Shlasha));
                head = (list) malloc(sizeof(list));
                current_pos = head;
                count++;
            }
            else
            {
                count++;
                ar = (Sa*) realloc(ar, count * sizeof(Shlasha));
                current_pos->next = (Node*) malloc(sizeof(Node));
            }
.....

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

P.S: Sa* - указатель на структуру


person DoronS    schedule 21.08.2011    source источник
comment
Кстати, я должен вернуть счетчик, а не массив   -  person DoronS    schedule 21.08.2011


Ответы (2)


Передайте его как двойной указатель, чтобы иметь возможность изменить сам адрес:

..., Sa **ar, list head)

а потом

*ar = (Sa*) realloc(*ar, count * sizeof(Shlasha));
person Blagovest Buyukliev    schedule 21.08.2011
comment
я пробовал это, но когда я потерпел неудачу, когда пытался назначить ему - person DoronS; 21.08.2011

Вы просто изменяете локальную копию массива функции, потому что это один указатель. Чтобы вернуть его за пределы массива, вы можете передать Sa **ar, а затем взять адрес указателя, который вы передаете в функцию, а затем в вашей функции, где бы вы ни использовали ar, измените его на *ar.

Вы также можете передать что-то вроде Sa **array, а затем назначить локальную переменную, если хотите избежать изменения кода, поэтому

Sa *ar = *array;

тогда вы все еще можете использовать

ar = (Sa*) malloc(sizeof(Shlasha));

затем в конце функции перед возвратом выполните:

*array = ar;
person shelleybutterfly    schedule 21.08.2011