[英]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.