1

好的,这是结构的定义:

typedef struct {
   int first;
   int last;
   int count;
   char * Array [50];
} queue;

我使用另一个函数来初始化它

void initialize(queue * ptr){
   ptr=malloc(sizeof(queue));
   ptr->first=0;
   ptr->last=0;
   ptr->count=0;
}

然后我使用 printf 打印出 first、last 和 count。这三个都应该为零。但是,我实际得到的是,count 是 0,正如我所料,但 first 和 last 是两个非常大的奇怪数字,每次运行程序时它们都会改变。谁能告诉我这里有什么问题?谢谢你。

4

3 回答 3

6

您正在按 value传递指针。该函数更改它接收到的参数的副本,但调用者的指针没有被修改并且可能未初始化。

您需要更改函数以获取queue**并传递要初始化的指针的地址。

或者,您可以返回一个指针,而不是将其作为参数传递。这是一种更简单的方法。

于 2012-04-27T22:33:26.673 回答
3

鉴于:

void initialize(queue * ptr);

像这样传递它:

queue q; // caller allocates a queue
initialize(&q);
// now q is initialized

此外,它是由调用者分配的——不要 malloc 它。

// bad
void initialize_bad(queue * ptr){
   ptr=malloc(sizeof(queue)); << nope. already created by the caller. this is a leak
   ptr->first=0;
   ptr->last=0;
   ptr->count=0;
}

// good
void initialize_good(queue * ptr){
   ptr->first=0;
   ptr->last=0;
   ptr->count=0;
   // ptr->Array= ???;
}

如果您更喜欢 malloc 它,请考虑使用以下方法返回新分配:

queue* NewQueue() {
   // calloc actually works in this case:
   queue* ptr = (queue*)calloc(1, sizeof(queue));
   // init here
   return ptr;
}

最终,“错误”是您的实现按值传递指针,立即将指针重新分配给新的 malloc'ed 分配,根据需要初始化 malloc'ed 区域,而无需修改参数并引入泄漏。

于 2012-04-27T22:35:33.147 回答
0

这是对您的程序的最小更改,它应该可以解决您的问题:

void initialize(queue * * pptr) {
    queue * ptr;
    ptr=malloc(sizeof(queue));
    if (ptr) {
        ptr->first=0;
        ptr->last=0;
        ptr->count=0;
    }
    /* The assignment on the next line assigns the newly allocated pointer
       into memory which the caller can access -- because the caller gave
       us the address of (i.e. pointer to) such memory in the parameter
       pptr. */
    *pptr = ptr;
}

最重要的更改是将 a 传递queue **给您的初始化函数 - 否则您将在调用时更改作为实际参数提供的副本。通过将指针传递给指针,您可以访问将指针存储在调用者中的原始变量。queue *initialize()

我无法抗拒,还添加了一张NULLmalloc(). 这并不能解决您的问题,但我无法让自己发布没有这样做的代码。

于 2012-04-27T22:56:21.427 回答