我正在尝试在C中实现一个整数向量。在vector_copy
中创建的向量指针约为0x3或0x2,这会导致分段错误。为什么会发生这种事?这真的让我很困惑,因为我对vector_new
有类似的实现。
typedef struct vector {
int* items;
size_t size;
size_t max;
} vector;
vector* vector_copy(vector* v) {
vector* v2;
memcpy(v2->items,v->items,v->max * sizeof(int*));
if (v2->items == NULL) {
return NULL;
}
v2->size = v->size;
v2->max = v->max;
return v2;
}
vector* vector_new(size_t initial_capacity) {
vector* newv;
newv->items = malloc(initial_capacity * sizeof(int*));
if (newv->items == NULL) {
return NULL;
}
newv->size = 0;
newv->max = initial_capacity;
return newv;
}
int main() {
vector* v;
vector* v2;
v = vector_new(4);
//new vector with capacity 4 and size 0
vector_push(v, 1);
vector_push(v, 2);
//1 and 2 are pushed back
v2=vector_copy(v);
//vector is supposed to be copied
vector_free(v);
vector_free(v2);
return 0;
}
vector* v2;
memcpy(v2->items,v->items,v->max * sizeof(int*));
这不是一个好主意。您基本上已经创建了一个指向某个任意位置的指针v2
(因为您还没有初始化它(,而v2
指针值可能是之前某个操作(a(遗留在堆栈上的值。然后,通过将字节复制到任意位置,各种奇怪的事情可能随之而来。
实际上,您需要为这个新向量分配一些内存,比如:
vector *v2 = vector_new(v->max);
memcpy(v2->items, v->items, v->max * sizeof(int));
您(希望(也会注意到我已经将sizeof
更改为使用int
而不是int*
。我怀疑items
指向前者的数组,在这种情况下,这是要使用的正确值。
因此以下函数是更好的起点:
vector *vector_copy(vector* v) {
// Use vector_new to get empty one with exact same properties.
vector *v2 = vector_new(v->max);
if (v2 == NULL) return NULL;
// Copy data in to it and return.
memcpy(v2->items, v->items, v->max * sizeof(int));
v2->size = v->size;
return v2;
}
您的new
函数中也存在完全相同的问题(没有结构分配和错误的sizeof
(,可以使用解决
vector *vector_new(size_t initial_capacity) {
// Allocate a vector structure, fail if no go.
vector *newv = malloc(sizeof(vector));
if (newv == NULL) return NULL;
// Allocate the data area, free structure and fail if no go.
newv->items = malloc(initial_capacity * sizeof(int));
if (newv->items == NULL) {
free(newv);
return NULL;
}
// Set up everything needed and return it.
newv->size = 0;
newv->max = initial_capacity;
return newv;
}
此函数基于initial_capacity
设置最大值,因此您无需在vector_copy()
中设置max
。
(a(I状态"可能"是因为许多实现在重用堆栈帧内存区域方面的工作方式。然而,这并不能保证,只有一种可能性。你应该假设它会有一些随机值,因此会表现得适当(或不适当,取决于你的观点(。