2

Cでリンクリストに問題があります。C++ではこのようなデータ構造しか実行していません。

Gdbは私に

Program received signal SIGSEGV, Segmentation fault. 0x0804a23c in addArg (base=0x1, argument=0x804e410 "is") at myshell.c:42 42 while ( (curr != NULL) && (curr->n != NULL) )

私はメモリに関係するセグメンテーション違反に精通していますが、メモリを正しく割り当てたと思いました。私は何が間違っているのですか?

addArgはとして呼び出されaddArg(currentCmd->args, lexeme);、currentCmdはノード構造体へのポインターです。

struct lnode {
 char *x;
 struct lnode *n;
};


struct node
  {
    char *command;
    struct lnode *args;
    int input;
    int output;
    int error;
    char *in;
    char *out;
    char *err;
    struct node *next;
    struct node *prev;
  };



void addArg(struct lnode *base, char *argument)
 {
 struct lnode *curr = base;

//this is line 42
  while ( (curr != NULL) && (curr->n != NULL) )
    curr = curr->n;

   curr -> n = malloc(sizeof(struct lnode));
   curr = curr->n;
   curr->x = strdup(argument);
   curr->n = NULL;
 }




struct node* createNode(char *command_, int input_, int output_, int error_, char *in_, char *out_, char *err_, struct node *prev_)
  {
  struct node *n;
  n = malloc(sizeof (struct node));
  n->command = strdup(command_);
  n->prev = prev_;
  n->next = NULL;
  n->input = input_;
  n->output = output_;
  n->error = error_;
  n->in = in_;
  n->out = out_;
  n->err = err_;
  n->args=malloc(sizeof(struct lnode));

 return n;
  }
4

3 に答える 3

0

currentCmd->args無効なポインタのようです。free()おそらくdメモリへのポインタ。または、初期化されていないポインタ、またはスコープ外にあるローカル変数へのポインタ(ただし、後者の2つはここでは当てはまらないようです)。

または、プログラムのどこかで範囲外のメモリを誤って上書きしてしまった可能性があります。ポインタの問題は、必ずしも失敗の時点にあるとは限りません。時にはそれらは以前のコードにあり、無関係なコードでさえあります。

于 2012-11-17T21:21:39.540 に答える
0

この問題を解決するにはlnode *argslnode argsメモリ管理に必要な変更を加えます。

于 2012-11-17T22:11:12.600 に答える
0

gdbの出力からわかるようにwhile ( (curr != NULL) && (curr->n != NULL) )、curr == NULLの場合でも、比較するためにcurr-> nにアクセスしようとしているため、currのみを比較し、curr->nのみを処理するように条件を変更する必要があります。 currがnullでない場合、curr-> n == NULLの場合、すぐにシクルを壊す可能性があります。

于 2012-11-18T17:37:55.487 に答える