簡體   English   中英

通過引用傳遞結構,返回指向新結構的指針

[英]Pass struct by reference, return pointer to new struct

我想通過引用將結構傳遞給函數,創建結構的新實例,銷毀原始結構並正確返回新結構。 這種情況的一個具體示例是隊列調整大小函數:

隊列結構本身:

// Queue for storage of pairs
typedef struct {
    int n;        // size of queue
    int m;        // no. of pairs in queue
    int f;        // index of front element
    int r;        // index of rear element
    pair *pairs;  // array of pairs
} queue;

隊列初始化例程:

// Initialises queue
int init(int const *n, queue *q) {

    q->n = *n;
    q->m =  0;
    q->f =  0;
    q->r =  0;

    q->pairs = (pair*) calloc(q->n, sizeof(pair));

    return 0;
}

隊列銷毀例程:

// Destroys queue
int destroy(queue *q) {

    q->n = 0;
    q->m = 0;
    q->f = 0;
    q->r = 0;
    free(q->pairs);

    return 0;
}

入隊例程:

// Adds pair to queue
int enqueue(pair *p, queue *q) {

    // resize queue if necessary
    if (isfull(q))  int status = resize(q);

    if (q->m > 0)  q->r = (++q->r) % q->n;
    q->pairs[q->r] = *p;
    q->m++;

    return 0;
}

我對隊列調整大小例程的看法(目前它因浮點異常而崩潰)。 我相信要正確調整隊列的大小,我需要將指針傳遞給隊列指針,但是到目前為止,我無法實現這一點。

// Resizes queue
int resize(queue *q) {

    // initialise new queue
    const int N = 2*q->n;
    queue p;
    init(&N, &p);

    // copy pairs from old to new queue
    for (int i = 0; i < q->m; i++) {
        pair f = dequeue(q);
        enqueue(&f, &p);
    }

    // destroy old queue
    destroy(q);

    // re-assign pointer to new queue
    q = &p;

    return 0;
}

重新分配指針是完全沒有用的。 您在本地進行了更改,但是並沒有修改原始對象。 您要做的是銷毀原始隊列,什么也沒留。

您要做的是就地修改提供的對象。

例如:

*q = p; 

暫無
暫無

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

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