繁体   English   中英

指针指针上的 Memset - 为什么它不起作用?

[英]Memset on pointer of pointers - why won't it work?

我正在用 c 实现一个矩阵库。 我已经创建了一个向量库,并且我已经定义了一个矩阵,它只是一个指向向量的指针集合(所以每个指针都引用一个向量结构,它是矩阵列。)我有一个指针指针而不是一个数组指针,因为 a) 我希望锯齿状矩阵成为可能 b) 我希望向量运算在矩阵的各个列上工作 c) 我希望实际矩阵是动态的。

这是矩阵类型定义:

    typedef struct mat {
    size_t alloc; // num of allocated bytes
    size_t w, h; // dimensions for the matrix
    vec** cols; // each column is a vector
    } mat;

假设我想调整矩阵的维度。 以下代码对我来说很好用:

    void resizem(mat* m, size_t w, size_t h) {
    m -> alloc = w * VECTOR_SIZE;
    m -> cols = realloc(m -> cols, m -> alloc);
//    if(w > m -> w) {
//        memset(m -> cols + m -> w, init_vec(h), (w - (m -> w)) * VECTOR_SIZE);
//    }
    if(w > m -> w) {
        for(int i = m -> w; i < w; i++) {
            m -> cols[i] = init_vec(h);
        };
    }
    for(int i = 0; i < w; i++) {
        resizev(m -> cols[i], h);
    };
    m -> w = w;
    m -> h = h;
}

我的方法如下:1)重新计算要重新分配的字节数并将其存储在矩阵结构中(列数*列大小)2)将内存重新分配给列3)如果矩阵的宽度“增长”,则每个新列都需要初始化为默认向量。 4) 调整矩阵中每个向量的大小。

但是请注意注释掉的行。 为什么我不能向列指针添加偏移量(前矩阵的大小)并在其余列上使用 memset 将它们初始化为默认向量? 当我运行它时它不起作用,所以我改用 for 循环。

请注意,如果它有帮助,这里是到目前为止矢量​​库的 github 链接: Github 链接

当您使用memset()您只调用initvec()一次。 所以所有元素都指向同一个向量。

此外, memset()将值分配给数组中的每个字节。 但是您的行应该包含指针,而不是字节。

顺便说一句,您的代码泄漏了大量内存,因为您从未free()行中的旧指针。 您需要在调用realloc()之前执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM