Я пытаюсь создать функцию, которая назначает память и проверяет, было ли выделено выделение памяти. Чтобы назначить любой тип памяти, я установил функцию для принятия void следующим образом: foo(void ***memory, size_t pointer_type)
. Намерение здесь, чтобы позволить пользователю ввести любой указатель в первую секцию, а затем размер типа указателя во втором правильно распределить, например:Использование указателя void вызывает ошибки предупреждения компилятора
int foo(void ***memory,size_t pointer_type)
{
void **temp;
if((temp=calloc(10,pointer_type))==NULL)
{
return(-1);
}
for(i=0;i<10;i++)
{
if((temp[i]=calloc(10,pointer_type))==NULL)
{
// free array as can't be used
for(i;i>=0;i--)
{
free(temp[i]);
temp[i]=NULL;
}
free(temp);
temp=NULL;
return(-1);
}
}
*memory=temp;
return(0);
}
int main()
{
double **pointer;
if(foo(&pointer, sizeof(double))==-1)
{
return(-1);
}
//do stuff then free memory
return (0);
}
В этом примере массив двойников должно быть создано. Я наткнулся на эту идею, читая другие сообщения SE объясняющие, что позволяет любой тип массив, который будет создан, однако компилятор дает следующее предупреждение:
предупреждение: передавая аргумент 1 из «Foo» из несовместимых типов указателей ноты : ожидается
void ***'
но аргумент типа'double ***'
Это говорит мне, что я что-то сделал это неправильно, однако при обработке массива в виде двойного массива после выделения все в порядке, так что я потерял относительно того, что делать работы ,
EDIT: Хорошо, поэтому использование 3-звездочного устройства предназначено для назначения памяти из отдельной функции для 2D-массива и было показано, как мне это было показано, т. Е. Если я использовал pointer[a][b]=10
, тогда он будет действовать как 2D массив. Если есть более эффективные способы, пожалуйста, продемонстрируйте пример, однако я все же требую, чтобы массив был любого типа, который в настоящее время является неотложным.
'Темп = calloc (10, pointer_type)' ... ты запах что-то? –
Существуют и другие проблемы, которые не будут улавливаться компилятором, например, вы не выделяете правильный размер для своих массивов. Чтобы выделить массив массивов «double», вы начинаете с, например. 'calloc (10, sizeof (double *))'. –
@Someprogrammerdude. Должно ли это быть достигнуто с помощью pointer_type = sizeof (double), поскольку я все еще даю правильный размер? – Hobojoe