我正在开发一个数组结构,只是为了好玩。 这个结构由模板参数推广,在启动时预先分配给定数量的项,然后,如果“忙”项超过可用项,则函数将重新分配内部缓冲区。 测试代码是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
template <typename T> struct darray_t {
size_t items;
size_t busy;
T *data;
};
#define DARRAY_REALLOC_ITEMS_STEP 10
#define da_size(da) (da)->busy
template <typename T>
void da_init( darray_t<T> *da, size_t prealloc ){
da->items = prealloc;
da->busy = 0;
da->data = (T *)malloc( sizeof(T) * prealloc );
}
template <typename T> T *da_next( darray_t<T> *da ){
if( da->busy >= da->items ){
da->data = (T *)realloc( da->data, sizeof(T) * DARRAY_REALLOC_ITEMS_STEP );
da->items += DARRAY_REALLOC_ITEMS_STEP;
}
return &da->data[ da->busy++ ];
}
int main(){
darray_t<int> vi;
int *n;
da_init( &vi, 100 );
for( int i = 0; i < 101; ++i ){
n = da_next(&vi);
*n = i;
}
for( int i = 0; i < da_size(&vi); ++i ){
if( vi.data[i] != i ){
printf( "!!! %d != %d\n", i, vi.data[i] );
}
}
return 0;
}
正如你所看到的,我在开始时预先分配了100个整数指针,然后我再次使用10个指针重新分配它们。 在main函数中,我执行for循环来检查项目的完整性,如果数组项目不是我想象的那样,我打印它的值并且...你知道吗? 我有以下消息:
!!! 11!= 135121
事实上,索引11处的项目应为“11”,为135121! :S
你能告诉我我的代码是不正确吗?
由于
注意 我完全知道以这种方式混合C和C ++是丑陋,而且我也知道如果使用这个结构会搞砸,例如:
darray_t<std::string>
这只是对int指针的测试。
答案 0 :(得分:3)
realloc不会自动增长内存 - 你必须这样做。例如:
da->data=(T*)realloc(da->data, sizeof(T)*(da->items+DARRAY_REALLOC_ITEMS_STEP));
(你应该处理realloc返回NULL)
答案 1 :(得分:1)
块的大小不正确:
da->data = (T *)realloc( da->data, sizeof(T) * DARRAY_REALLOC_ITEMS_STEP );
整个块与增量一样大。尝试
da->busy + sizeof(T) * DARRAY_REALLOC_ITEMS_STEP