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

エラーは、おそらく whenenqueue()が文字列へのポインタを取得し、それをキューに格納するためです。声明では:

name = usInput;

enqueue()渡すポインターを、自動ストレージ配列の先頭へのポインターに置き換えます。これは、関数が終了した後に無効になるストレージです。これが、ガベージが表示される理由です。割り当てが解除されたメモリへのポインターを格納/使用すると、未定義の動作が発生します。

動的メモリ割り当てと文字列コピーについて混乱しているようです。これを処理する方法の 1 つを次に示します。

/* 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 に答える