簡體   English   中英

c-malloc類型定義的指針

[英]c - malloc typedef'd pointer

給定typedef的ptr類型,如何訪問基本類型?

例如,考慮雙打的“數組”:

typedef double* vec_t;

如果我嘗試這樣初始化:

void init_vec(int n, vec_t v){
    v = (vec_t)malloc(n*sizeof(*vec_t));
    //...
}

gcc並不完全像那樣

錯誤:“ vec_t”之前的預期表達式

v =(vec_t)malloc(n * sizeof(* vec_t));

  ^ 

這樣做的正確方法是什么?

我當然可以簡單地寫v = (vec_t)malloc(n*sizeof(double)); ,但這不是我想要的。

首先,不要在C中vec_t * malloc()的結果。它返回一個void指針,該指針將被安全提升為vec_t *

其次, *vec_t試圖取消引用類型,這在語義上是無效的。 您需要取消引用vec_t類型的變量。 方便地,您只有一個。

v = malloc(n * sizeof *v);

編輯:正如@chqrlie指出的那樣, malloc()的內存在返回時立即丟失。 分配的地址已分配給v ,但是調用函數的v副本不會被覆蓋。

void init_vec(int n, vec_t v)是一個問題:該函數無法將分配的指針返回給調用方。 它應該采用指向vec_t的指針,或者返回vec_t類型的值。

一個簡單的解決方案是:

vec_t init_vec(int n) {
    vec_t v = malloc(n * sizeof *v);
    //...
    return v;
}

不建議將指針隱藏在typedefs后面,因為它會使代碼可讀性降低,並且更容易出錯。 您的vec_t類型實際上應該是一個結構,其中包含用於數組大小的size成員以及指向double或flexible數組的指針。 您還可以區分分配的長度size和使用的部分length

typedef struct vec_t {
    size_t size, length;
    double a[];
} vec_t;

vec_t *init_vec(size_t n) {
    vec_t *v = malloc(sizeof *v + n * sizeof(*v->a));
    v->size = v->length = n;
    for (size_t i = 0; i < n; i++) {
        v->a[i] = 0;
    }
    return v;
}

最后,由於init_vec分配了向量,因此應為其指定一個更明確的名稱,例如create_vecnew_vecallocate_vec

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM