array_init()
не назначил ничего для .size
и .capacity
членов.
Предлагаемые изменения:
struct array {
// long size;
// long capacity;
// `size_t` is the right-size for array indexing.
// Be mindful that `size_t` is some _unsigned_ type.
size_t size;
size_t capacity;
int* data;
};
// struct array* array_init(long initial_capacity) {
struct array* array_init(size_t initial_capacity) {
struct array* v = malloc(sizeof(struct array));
if (v == NULL) {
return NULL;
}
v->data = malloc(sizeof(int)*initial_capacity );
// If initial_capacity is 0, a NULL return does not certainly mean out of memory
//if (v->data==NULL){
if (v->data==NULL && initial_capacity != 0){
free(v); // also free prior allocation
return NULL;
}
// Add
v->size = 0;
v->capacity = initial_capacity;
return v;
}
v->capacity *= 2
слабое, поскольку это не такИзвестно, что v->capacity > 0
.
int append(struct array *v, int elem) {
if (v->size >= v->capacity) {
// v->capacity *= 2;
v->capacity = v->capacity > 0 ? v->capacity*2 : 1;
indexget()
неясно.Зачем возвращать указатель , когда индекс выходит за пределы диапазона?
#define BAD_VALUE 0 /* or some unused `int` value for the application */
int indexget(struct array *v, long index) {
// if (index >= v->size) { incomplete test if `index` is signed
if (index >= v->size || index < 0) {
// return NULL;
return BAD_VALUE;
}
return v->data[index];
}
или
Код возвращает адрес элемента массива?
//int indexget(struct array *v, long index) {
int *indexget(struct array *v, size_t index) {
if (index >= v->size) {
return NULL;
}
// return v->data[index];
return &v->data[index];
}
append()
отсутствуетпроверка успешности перераспределения.
// v->data = realloc(v->data, sizeof(int) * v->capacity);
void *p = realloc(v->data, sizeof(int) * v->capacity);
if (p == NULL) {
return EXIT_FAILURE; // Handle out-of-memory in some fashion
}
v->data = p;