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



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

我不认为我的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;
}

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;

相关内容

  • 没有找到相关文章

最新更新