0

我正在为这个程序运行 Xcode 4.4.1。

对象:通过调用将 用户输入的字符串插入队列并通过调用enqueue取出插入的字符串dequeue

测试输入:

啊啊啊

什么不起作用:

在我调用的那一行,dequeue(queue, &name)我期望得到 aaa 的出列值。但是,我得到一个垃圾或 NULL 值。

// 原型声明

int    enqueue     ( QUEUE *queue, void * dataInPtr );  // returns success
int    dequeue     ( QUEUE *queue, void **dataOutPtr ); // returns success
bool processQueue(QUEUE *queue, bool flag);

// 函数定义(仅processQueue显示)

bool processQueue(QUEUE *queue, bool flag) {
  char *name;
  char usInput[MAX_LENGTH_INPUT + 1];
  int success;

  if(ENQUEUE == flag) {
    do {
      printf("Enter 3 letters for name: ");
      fscanf(stdin, "%s", usInput);
    } while(!validateInputName(usInput));

    name = malloc(sizeof *name * 4);
    name = usInput;
    printf("usInput==\"%s\" and name==\"%s\"\n", usInput); // correctly shown   
    return enqueue(queue, name);
  } else { // DEQUEUE == flag
    if (!emptyQueue(queue)) {
      dequeue(queue, &name); // I assume I have problem here??
      printf("dequeued name == \"%s\"\n", name); // incorrectly shown. why???
    // TODO: free(name);
      return true;
    } else {
      return false;
    }
  }
}

// 输出:

usInput=="aaa" and name=="aaa"
dequeued name == "¿" // here, I am expecting aaa, not ¿

任何帮助表示赞赏!谢谢!

4

2 回答 2

1

我猜这是问题所在:

name = malloc(sizeof *name * 4);
name = usInput;

通过重置name指向临时usInput,您将 (a) 泄漏内存并 (b) 导致未定义的行为。

于 2013-01-23T10:39:33.590 回答
0

错误是因为 when 可能enqueue()需要一个指向字符串的指针并将其存储在队列中。在声明中:

name = usInput;

您将传递给enqueue()的指针替换为指向自动存储数组开头的指针;那是函数终止后无效的存储,这就是您看到垃圾的原因。存储/使用指向已释放内存的指针会调用未定义的行为。

您似乎对动态内存分配和字符串复制感到困惑。这是您可以处理它的一种方法:

/* First, allocate enough memory. Let's say 12 bytes is enough. */
name = malloc(12);
/* We'll need to copy our string to the memory we allocated and truncate it to 12 bytes */
if (snprintf(name, 12, "%s", usInput) < 0) {
    printf("Output error encountered by snprintf\n");
    return -1; /* error value */
}
/* Now enqueue NAME assuming that enqueue() does not copy it. */
return enqueue(queue, name);

请注意:

  1. 始终检查错误。
  2. 始终施加最大输入大小。
  3. 不要泄漏内存 -free()你是什么malloc()
于 2013-01-23T10:46:24.810 回答