1

リンクされたリストを使用して、C でキュー (文字列バージョン) プログラムを作成しようとしています。

構造は次のとおりです。

struct strqueue;
typedef struct strqueue *StrQueue;

struct node {
  char *item;
  struct node *next;
};

struct strqueue {
  struct node *front;//first element
  struct node *back;//last element in the list
  int length;
};

最初に新しい StrQueue を作成します

StrQueue create_StrQueue(void) {
  StrQueue q = malloc(sizeof (struct strqueue));
  q->front = NULL;
  q->back = NULL;
  q->length = 0;
  return q;
}

str のコピーを作成し、キューの最後に配置します

void push(StrQueue sq, const char *str) {
  struct node *new = malloc(sizeof(struct node));
  new->item = NULL;
  strcpy(new->item,str);//invalid write size of 1 ?
  new->next = NULL;
  if (sq->length == 0) {
  sq->front = new;
  sq->back = new;
} else {
  sq->back->next = new;
  sq->back = new;
}
sq->length++;
}

sq の先頭にあるノードを解放し、キューの最初にあった文字列を返します

char *pop(StrQueue sq) {
 if (sq->length == 0) {
 return NULL;
}
 struct node *i = sq->front;
 char *new = sq->front->item;
 sq->front = i->next;
 sq->length --;
 free(sq->front);
 return new;
}

strcpy(new->item,str); で無効な書き込みサイズ 1 を取得しました。なぜこのエラーが発生したのかわかりません。誰でも理由を教えてもらえますか?どうすれば修正できますか? 前もって感謝します。

4

2 に答える 2

1

無効write size of 1 at strcpy(new->item,str);になりました。このエラーが発生した理由がわかりません。誰でも理由を教えてもらえますか?どうすれば修正できますか?

どうして:

このコード:

new->item = NULL;
strcpy(new->item,str);//invalid write size of 1 ?

最初の引数に null ポインターを渡すことは想定していません。割り当てられたメモリへのポインターにする必要があります。このエラー メッセージが表示される理由は、strcpy の実装がおそらく次のようになっているためだと想像できます。

for (int i = 0; str2[i]; i++) str1[i] = str2[i];

そして、ループの最初の繰り返しで、アドレス(メモリの読み取り専用セクション)forに書き込みます。これにより、 . ただし、なぜ のサイズしか得られないのかはわかりません(文字列全体のサイズになると思います)。これは、 a )がサイズのみであるか、 b)シグナルがプログラムを停止するためである可能性があります。0invalid write of size 11 str1SIGSEGV

直し方:

次のように、new->itemを呼び出す前に にスペースを割り当てます。strcpy

new->item = malloc (strlen (str) + 1); // + 1 for null-terminating character

ただし、おそらく次のようなエラー チェックを含めることができます。

int len = strlen (str) + 1;
if (len){
    new->item = malloc (len);
    if (!new->item){
        return;
    }
}
于 2013-07-28T01:30:41.840 に答える