C中的空数组并返回一个指针

时间:2015-07-13 21:59:48

标签: c arrays

我是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;    
}

这是制作空数组列表的正确方法吗?并解释它不是吗?

2 个答案:

答案 0 :(得分: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 :(得分:0)

我假设您想要返回指向struct List的全新实例的指针。这是结构良好的C编程中常见的习惯用法,类似于C ++中对象构造函数和运算符new的组合。

我可能会这样写:

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,但更好的类型可能是size_t。 (出于同样的原因,size_t可能是结构中sizemaxSize字段的更好类型。)
  • 请注意,我为结构及其内部“数组”调用了malloc两次。
  • 请注意,如果第二个malloc失败并导致整个newList调用失败,则会释放先前分配但现在不需要的lp
  • 此函数将消息打印到stderr并在失败时返回NULL,要求调用者检查该消息。其他策略是打印消息并致电exit,或打印任何内容并返回NULL