我是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;
}
这是制作空数组列表的正确方法吗?并解释它不是吗?
答案 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
可能是结构中size
和maxSize
字段的更好类型。)malloc
两次。malloc
失败并导致整个newList
调用失败,则会释放先前分配但现在不需要的lp
。stderr
并在失败时返回NULL
,要求调用者检查该消息。其他策略是打印消息并致电exit
,或打印任何内容并返回NULL
。