Вы можете вернуть двойной ** из вашей функции копирования, как это.
double ** copy(double *src, int row, int col)
{
// first allocate the array with required size
double **copiedArr = (double **) malloc(sizeof(double *)*row);
for(int i=0;i<row;i++)
{
// create space for the inner array
*(copiedArr+i) = (double *) malloc(sizeof(double)*col);
for(int j=0; j<col; j++)
{
// copy the values from source to destination.
*(*(copiedArr+i)+j) = (*(src+i+j));
}
}
// return the newly allocated array.
return copiedArr;
}
звонок этой функции делается как этот.
double src[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
double **dest = copy(&src[0][0],3,3); //here is your new array
Здесь вы должны присвоить возвращаемое значение copy()
для double**
не double[][]
. Если вы попытаетесь присвоить возвращаемое значение массиву, он будет генерировать ошибку «Несовместимые типы» (detail).
Как память выделена copiedArray
на кучу, поэтому вы должны взять на себя ответственность за очистку памяти.
void freemem(double **mem, int row)
{
for(int i=0;i<row; i++)
{
free(*(mem+i));
}
free(mem);
}
Я также хочу отметить некоторую коррекцию в примере кода:
- возвращение типа основной должно быть внутр.
- следует положить оператор возврата в конец основного.
- вы не можете вернуть выделенное стеком значение, это является причиной аварии в большинстве случаев.
Возврат 'double *'. –
'main' требуется для возврата' int' в C++ (и должен быть на C). Кроме того, если вы используете C++, используйте 'std :: array'. Вы можете вернуть его без проблем. – chris
Вы не можете возвращать массивы из функции в C, если они не обернуты в структуру. Вот и все. –