簡體   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