【发布时间】:2018-10-08 19:18:11
【问题描述】:
我想通过引用将结构传递给函数,创建结构的新实例,销毁原始结构并正确返回新结构。这种情况的一个具体示例是队列调整大小函数:
队列结构本身:
// 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;
}
【问题讨论】:
-
您没有显示
enqueue,但是如果您将地址存储在结构中,则传递局部变量的地址是一个很大的禁忌:您会发现所有变量都具有相同的地址,当f超出范围时无效 -
@Jean-FrançoisFabre 我很确定
enqueue从提供的指针复制 - 这是通常的做法。 -
将指针传递给 const 整数是代码混淆的练习。我敦促你赞成通过 vale 为
n。 -
@StoryTeller,你能详细说明一下吗?为什么这是代码混淆练习?
-
将一个指向对象的指针传递给一个对象通常有一个明显的原因:允许对超出函数范围的对象进行修改。但是您只需要函数调用时的整数值。这就是按值传递的目的。这很清楚,也很容易推理。用指针模糊它并不能成为一个好的程序来推理。