首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的房地产行为

奇怪的房地产行为
EN

Stack Overflow用户
提问于 2010-05-26 10:22:44
回答 2查看 314关注 0票数 2

我正在开发一个数组结构只是为了好玩。此结构由模板参数概括,在启动时预先分配给定数量的项,如果“繁忙”项多于可用项,则函数将实际分配内部缓冲区。测试代码是:

代码语言:javascript
复制
#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个指针来实现它们。在主函数中,我执行一个for循环来检查项的完整性,如果数组项不像我预期的那样,我会打印它的值和.你知道吗?我有以下信息:

11 = 135121

事实上,索引11的项目,应该是'11',是135121!

你能告诉我我的代码是否不正确吗?

谢谢

注意到我完全知道用这种方式混合C和C++是丑陋的,我也知道如果使用这个结构会搞砸,例如:

代码语言:javascript
复制
darray_t<std::string>

这只是对int指针的测试。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-26 10:35:13

realloc不会自动增长内存块--您必须这样做。例如:

代码语言:javascript
复制
da->data=(T*)realloc(da->data, sizeof(T)*(da->items+DARRAY_REALLOC_ITEMS_STEP));

(您应该处理realloc返回空)

票数 3
EN

Stack Overflow用户

发布于 2010-05-26 10:35:12

块的大小不正确:

代码语言:javascript
复制
da->data   = (T *)realloc( da->data, sizeof(T) * DARRAY_REALLOC_ITEMS_STEP );

整个块和增量一样大。试一试

代码语言:javascript
复制
da->busy + sizeof(T) * DARRAY_REALLOC_ITEMS_STEP
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2912037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档