当我尝试设置vec->data[vec->volume] = val
而不是在vec-volume
中设置vec->data
的索引时,只需将vec->volume
设置为val
。我真的不明白为什么会发生这种情况,我对C仍然很陌生。任何帮助都将受到赞赏:)
下载完整的代码
#include <stdio.h>
#include <stdlib.h>
#include "vector.h"
vector *vector_new(void) {
vector *vec = (vector *)malloc(sizeof(vector));
if (vec == NULL) {
fprintf(stderr, "Could not allocate memory for vector.\n");
exit(1);
}
vec->volume = (unsigned int)0;
vec->size = (unsigned int)1;
return vec;
}
int vector_peek(vector *vec, unsigned int idx) {
if (idx < vec->size)
return vec->data[idx];
fprintf(stderr, "Array out of bounds.\n");
exit(1);
}
void vector_push(vector *vec, int val) {
if (vec->volume + 1 >= vec->size)
vector_grow(vec);
vec->volume += 1;
vec->data[vec->volume] = val; //THIS IS WHERE THE ISSUE IS
}
void vector_pop(vector *vec) {
if (vec->size - 1 <= vec->size / 2)
vector_shrink(vec);
vec->volume -= 1;
}
void vector_grow(vector *vec) {
vec->data = (int *)realloc(&vec->data, vec->size * 2 * 4);
vec->size *= 2;
if (vec->data == NULL) {
fprintf(stderr, "Could not grow vector.\n");
exit(1);
}
}
void vector_shrink(vector *vec) {
vec->data = (int *)realloc(&vec->data, vec->size / 2 * 4);
vec->size /= 2;
if (vec->data == NULL) {
fprintf(stderr, "Could not grow vector.\n");
exit(1);
}
}
void vector_print(vector *vec) {
printf("Size: %i, volume: %i, Elements:", vec->size, vec->volume);
/*for (int i; i < vec->volume; i++)
printf(" %i", vec->data[i]);*/
printf("\n");
}
int main(void) {
vector *newvec = vector_new();
vector_print(newvec);
vector_push(newvec, 12);
vector_print(newvec);
return 0;
}
这是标题
#ifndef VECTOR_H__
#define VECTOR_H__
typedef struct vec {
int *data;
unsigned int volume;
unsigned int size;
} vector;
vector *vector_new(void);
int vector_peek(vector *vec, unsigned int idx);
void vector_push(vector *vec, int val);
void vector_pop(vector *vec);
void vector_grow(vector *vec);
void vector_shrink(vector *vec);
void vector_print(vector *vec);
#endif