2017-02-22 21 views
-2

Я пытаюсь создать функцию, которая назначает память и проверяет, было ли выделено выделение памяти. Чтобы назначить любой тип памяти, я установил функцию для принятия 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 массив. Если есть более эффективные способы, пожалуйста, продемонстрируйте пример, однако я все же требую, чтобы массив был любого типа, который в настоящее время является неотложным.

+0

'Темп = calloc (10, pointer_type)' ... ты запах что-то? –

+0

Существуют и другие проблемы, которые не будут улавливаться компилятором, например, вы не выделяете правильный размер для своих массивов. Чтобы выделить массив массивов «double», вы начинаете с, например. 'calloc (10, sizeof (double *))'. –

+0

@Someprogrammerdude. Должно ли это быть достигнуто с помощью pointer_type = sizeof (double), поскольку я все еще даю правильный размер? – Hobojoe

ответ

1

Только a void* считается void -поинтер, к и из преобразования других указателей выполняется неявно (в C).

void** является указателем на void -поинтер, который не является void -pointer. То же самое относится к void***.

Таким образом, чтобы исправить ошибку вы цитируете Смените

int foo(void ***memory,size_t pointer_type) 

быть

int foo(void *memory, size_t pointer_type) 
-2

Компилятор выдает право предупреждения, так как тип

void *** 

отличается от типа

double *** 

Явной отливка зафиксирует предупреждение:

if (foo((void ***)&pointer, sizeof(double))==-1) 
+1

, но явное приведение не устанавливает, что это может иметь неопределенное поведение. –

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