在动态数组中获取错误数量的元素

时间:2019-02-27 11:23:19

标签: c dynamic-arrays

我是C语言的初学者,我正在尝试构建一个非常简单的动态数组。我的代码可以编译,但是返回数组大小时输出错误的大小。例如,当我测试最终数组大小为0时,它输出13744632839234567870,这非常大而且非常错误。

我认为我的array_size函数没有错。我怀疑在append中它出了问题,但是我只是找不到它出了什么问题。

如果有人愿意帮助我,我将万分感谢!

#include <stdlib.h>

struct array
{
    long size;
    long capacity;
    int* data;
};

struct array* array_init(long initial_capacity) {
    struct array* v = malloc(sizeof(struct array)); 
    if (v==NULL){
        return NULL;
    }
}    

int append(struct array *v, int elem) {
    if (v->size >= v->capacity) {

        v->capacity *= 2;
        v->data = realloc(v->data, sizeof(int) * v->capacity);
    }
    v->data[v->size] = elem;
    v->size++;
    return 0;    
}

int indexget(struct array *v, long index) {
    if (index >= v->size) {
        return NULL;
    }
    return v->data[index];
}

long array_size(struct array *v) {
    return v->size;
}

2 个答案:

答案 0 :(得分:3)

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()不清楚。为什么当索引超出范围时暗示返回 pointer

#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;

答案 1 :(得分:0)

array_init内,您应将sizecapacity设置为0,否则它们将具有随机值。

append内的realloc之后,您还需要检查NULL。