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