2015-07-13 3 views
-2

Я очень новичок в программировании на C, и я не уверен в создании функции, которая создает массив с пространством, выделенным для массива, и возвращает ему указатель на массив. Вот то, что я до сих пор: Editпустой массив в C и возвращающий указатель

struct Array { 
    int* sort; 
    int arraySize; 
    int totalSize; 
}; 


array* createarray(int elements) 
{ 
    int arr[elements]; 
    int *p; 
    int *p_array; 
    p = &arr; 
    p_array = (int *)malloc(sizeof(int)*elements); 
    return p;  
} 

Является ли это правильный способ сделать пустой список массива? И объясните, если это не понравится?

+1

Опубликовать определение 'list'. –

+1

Стандартное предупреждение: не набрасывайте 'void *' как возвращаемое 'malloc' & friends. – Olaf

+2

Поскольку вы не возвращаете 'p_array', вы пропускаете память. Кроме того, вам не нужно выдавать результат 'malloc()'. –

ответ

0

Разделите свою работу на отдельные функции. Не бросать malloc. Например:

int* create_array(int elements) 
{ 
    int* p = NULL; 
    p = malloc(sizeof(int) * elements); 
    if (!p) { 
     fprintf(stderr, "Error: Could not allocate space for array\n"); 
     exit(EXIT_FAILURE); 
    } 
    return p;  
} 

struct List* create_list(int max_elements) 
{ 
    struct List* l = NULL; 
    l = malloc(sizeof(struct List)); 
    if (!l) { 
     fprintf(stderr, "Error: Could not allocate space for list\n"); 
     exit(EXIT_FAILURE); 
    } 
    l->sortedList = create_array(max_elements); 
    l->size = 0; 
    l->maxSize = max_elements; 
    return l; 
} 
+1

Похоже, чтобы получить upvote, вам нужно контекстуализировать этот код? Возможно, добавьте более подробное объяснение. –

+1

Код должен сам документ, надеюсь. –

+1

* Я очень новичок в программировании на C * - это первые слова в вопросе. Просто дополнительный комментарий здесь и там будет полезно, я думаю. В любом случае, это правильно ... +1 –

0

Я предполагаю, что вы хотите вернуть указатель на совершенно новый экземпляр struct List. Это распространенная идиома в хорошо структурированном программировании на С и аналогична комбинации конструктора объектов и оператора new в C++.

я мог бы написать что-то вроде этого:

struct List *newList(int maxSize) 
{ 
    struct List *lp = malloc(sizeof(struct List)); 
    if(lp == NULL) 
     { 
     fprintf(stderr, "out of memory\n"); 
     return NULL; 
     } 
    lp->sortedList = malloc(maxSize * sizeof(int)); 
    if(lp->sortedList == NULL) 
     { 
     free(lp); 
     fprintf(stderr, "out of memory\n"); 
     return NULL; 
     } 
    lp->size = 0; 
    lp->maxSize = maxSize; 
    return lp; 
} 

Есть несколько вещей, чтобы отметить здесь:

  • Здесь я объявил Переданный maxSize параметра как int, хотя лучше тип будет, вероятно, be size_t. (Точно так же size_t может быть лучшим типом для полей size и maxSize.)
  • Обратите внимание, что я дважды вызывал malloc для структуры и для ее внутреннего «массива».
  • Обратите внимание, что если второй malloc сбой и приводит к сбою всего вызова newList, он освобождает ранее выделенный, но теперь ненужный lp.
  • эта функция выводит сообщение на stderr и возвращает NULL при сбое, требуя, чтобы вызывающий абонент проверил это. Другие стратегии состоят в том, чтобы напечатать сообщение и позвонить exit, или распечатать ничего и вернуть NULL.
Смежные вопросы