gpt4 book ai didi

c - 使用相同程序的单个队列和多个队列不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 06:01:46 27 4
gpt4 key购买 nike

这里有两个用简单形式实现队列数据结构的c程序

  • 第一个:

    定义一个队列,它工作得很好

  • 第二个:

    定义多个队列,执行时崩溃

除了 main() 是实现之外,两个程序的功能相同有点不同。

所以这里的问题是:为什么第二个代码不起作用?

* 这是代码 *

代码 1:

/*
Single queue -- this work perfectly
*/
#include <stdio.h>
#define Q_MAX_SIZE 255

struct queue {
int* pointer;
int* currentValue;
int max, count, theQueue[Q_MAX_SIZE];
};

//prototyps
void initQueue(struct queue*);
unsigned short pushQueue(struct queue*, int);
int* popQueue(struct queue*);

int main(void) {
int j;
struct queue q;

initQueue(&q);

for (j = 0; j < 6; j++)
pushQueue(&q, j);

int* inputobj = popQueue(&q);
while (inputobj != NULL)
{
printf("%d ", *inputobj);
inputobj = popQueue(&q);
}

printf("\n\ndone..Queue is empty\n");

return 0;
}

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

void initQueue(struct queue *Q)
{
Q->pointer = Q->theQueue;
Q->max = Q_MAX_SIZE;
Q->count = 0;
}

unsigned short pushQueue(struct queue *Q, int input) {
if (Q->count < Q->max)
{
*Q->pointer = input;
Q->pointer++;
Q->count++;
return 1;
}
else
return 0;
}

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

int* popQueue(struct queue *Q) {
int i;
if (Q->count > 0)
{

*Q->currentValue = *Q->theQueue;
Q->pointer--;
Q->count--;

for (i = 0; i < Q->count; i++)
{
int* currentPtr = Q->theQueue + i;
int* nextPtr = currentPtr + 1;
*currentPtr = *nextPtr;
}

return Q->currentValue;
}
else
NULL;
}

代码 2:

/*
Multiple queues -- this not work and crash at execution
*/
#include <stdio.h>
#define Q_MAX_SIZE 255

struct queue {
int* pointer;
int* currentValue;
int max, count, theQueue[Q_MAX_SIZE];
};

//prototyps
void initQueue(struct queue*);
unsigned short pushQueue(struct queue*, int);
int* popQueue(struct queue*);

int main(void) {
int i, j;
struct queue obj[5];

for(i=0; i<5; i++)
{
initQueue(&obj[i]);

for(j = 0; j<3; j++)
{
pushQueue(&obj[i], j);
}
}

for(i=0; i<5; i++)
{
printf("Queue[%d]:\n", i);
int* inputobj;
inputobj = popQueue(&obj[i]);

while(inputobj != NULL)
{
printf("Queue[No.%d] = %d\n", i, *inputobj);
inputobj = popQueue(&obj[i]);
}
putchar('\n');
}

return 0;
}

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

void initQueue(struct queue *Q)
{
Q->pointer = Q->theQueue;
Q->max = Q_MAX_SIZE;
Q->count = 0;
}

unsigned short pushQueue(struct queue *Q, int input) {
if (Q->count < Q->max)
{
*Q->pointer = input;
Q->pointer++;
Q->count++;
return 1;
}
else
return 0;
}

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

int* popQueue(struct queue *Q) {
int i;
if (Q->count > 0)
{

*Q->currentValue = *Q->theQueue;
Q->pointer--;
Q->count--;

for (i = 0; i < Q->count; i++)
{
int* currentPtr = Q->theQueue + i;
int* nextPtr = currentPtr + 1;
*currentPtr = *nextPtr;
}

return Q->currentValue;
}
else
NULL;
}

更新:问题出在initQueue(),通过分配内存解决了 对于 Q->currentValue 这里是编辑后的函数:

void initQueue(struct queue *Q)
{
Q->currentValue = malloc(sizeof(int));
Q->pointer = Q->theQueue;
Q->max = Q_MAX_SIZE;
Q->count = 0;
}

最佳答案

正如两个答案已经指出的那样,问题是 Q->current_value 从未被赋值,因此它指向一个未定义的地址,并且每次取消引用都像 *Q-> currentValue = .. 是未定义的行为。代码 1 看似有效的事实并不能证明其他任何事情,因为由于 UB 的性质,无法保证任何行为,您的程序可能会或可能不会崩溃(或者您的狗可能会爆炸,龙会从您的 Nose 里飞出来... :- ) )

当然有多种解决方案,它们的含义各不相同:

  1. 如果 currentValue 应该只保存某个值的副本,它可以是 int currentValue 而不是 int *... 作业将是

    Q->currentValue = *Q->theQueue;

    返回语句将是return &Q->currentValue。在这种情况下,您将返回指向 theQueue[0]

  2. 原始值的指针
  3. 如果你想指向theQueue中的位置,Jim的anser会告诉你正确的方法:

    Q->currentValue = Q->theQueue;

    在那种情况下,您将返回一个指向 theQueue[0]值的指针(这可能是您不想要的)

  4. 您可以将内存分配给 Q->currentValue my malloc( sizeof (int) ); 然后保持分配不变。在这种情况下,您将返回一个指向 theQueue[0]原始 值的指针,如 (1)

关于c - 使用相同程序的单个队列和多个队列不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18473983/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com