Как выделить память в этом случае?


У меня есть указатели в main, для которых я не знаю, что это размер. Функция возвращает этот указатель в main. Внутри функции я могу вычислить размер указателя и, следовательно, должен хранить в них значения и возвращать их в main. Как изменить / выделить память в этом случае.

int main()
{
    int *row_value, *col_value;
    col_row_value(row_value,col_value);
    ...
    return(0);
}

void col_row_value(row_value,col_value)
{
    // how to allocate/modify memory for row_value and col_value and store data
    // for example would like to allocate memory here
    int i;
    for(i=0;i<10;i++) {
        row_value[i]=i;
        col_value[i]=i;
    }
}

Я пробовал что-то вроде этого, это не работает

int main()
{
    int *row_value, *col_value;
    row_value=NULL;
    col_value=NULL;
    col_row_value(&row_value,&col_value);
    ...
    return(0);
}

void col_row_value(int **row_value,int **col_value)
{
    // how to allocate/modify memory for row_value and col_value and store data
    // for example would like to allocate memory here
    int i;
    *row_value=(int*)realloc(*row_value,10*sizeof(int));
    *col_value=(int*)realloc(*col_value,10*sizeof(int));
    for(i=0;i<10;i++) {
        row_value[i]=i;
        col_value[i]=i;
    }
}
2 2

2 ответа:

Это:

*row_value=(int*)realloc(row_value*,10*sizeof(int));

Должно быть:

*row_value = realloc(*row_value,10*sizeof(int));
                 /** ^ **/
Обратите внимание, что гипс не нужен. Назначьте результат realloc() временному указателю в случае сбоя перераспределения, что будет означать, что исходная память будет недоступна.
int* tmp = realloc(*row_value, 10 * sizeof(*tmp));
if (tmp)
{
    *row_value = tmp;
}

Обратите внимание, что цикл for не присваивает значение первому элементу в row_value или col_value:

for(i=1;i<10;i++)

Так как он начинается с индекса 1 и присваивания внутри for должны быть:

(*row_value)[i] = i;
(*col_value)[i] = i;

Вторая версия по существу правильна.

Вам нужно сказать:

realloc(*row_value, 10 * sizeof(int));
//     ^^^

Берегись звезды!

Если это поможет, переименуйте аргументы функции в:

col_row_value(int ** ptr_to_row_ptr, int ** ptr_to_col_ptr);
Таким образом, вы не будете так сильно запутывать себя.