0

コードの目的: 一意の要素リンク リストを維持するため...UFID は一意のキーワードです。

Structure declaration:

    struct sharedFiles
    {
      char UFID[50];
      int valid;                    //valid 1 if someone have this file in write mode
      int shared;                   //no of user's reading this file
      struct sharedFiles *next;     //pointer to next node
    }*sfstart,*sfend;               //sfstart points to the first node of linked list and efend to the last node of linked list so that it will be easy to just insert at the end without traversing the linked list

エラーの説明: 以下のコードを 2 回目に呼び出すと、セグメンテーション エラーが発生します。GDB でデバッグしようとしましたが、行の場所にアクセスできないと表示されます

if(strcmp(sftemp->UFID,ufid)==0)

上記の行では、sftemp->UFIDにアクセスできません。

/*Function code*/


  int addShareList(char *ufid,int mode)      //mode=0 (read)  and mode=1 (Write request)
{
  struct sharedFiles *sftemp,*newnode;

  sftemp=sfstart;
   if(sfstart==NULL)   //if list is empty add first node
   {
       sfstart=(struct sharedFiles *) malloc(sizeof(struct sharedFiles));
       strcpy(sfstart->UFID,ufid);
       sfstart->valid=mode;
       sfstart->shared=1;
       sfstart->next=NULL;
       sfend=sfstart;             //this node will also be last node of Linked list
       return 0;
   }
   else                 //if list is not empty
   {

        while(sftemp->next != NULL)    //traverse till last node
        {
          if(strcmp(sftemp->UFID,ufid)==0)
          {
             //here if same node found some manupulation to the struct variables

          }
         sftemp=sftemp->next;
        } //while


  if(sftemp->next==NULL)  //procvess last node
       {

         if(strcmp(sftemp->UFID,ufid)!=0) //if last node not same add node at the end of   Linked list
         {
           newnode=(struct sharedFiles *) malloc(sizeof(struct sharedFiles));
           strcpy(newnode->UFID,ufid);
           newnode->valid=mode;
           newnode->shared=1;
            newnode->next=NULL;
           sftemp->next=newnode;
           sfend=newnode;
           return 0;
          }
          else //if last node is same
          {

                //some manipulations to struct variables 
          }
       } //if


   }

return -1;
}//addShareList

上記のコードは、最初の要素を挿入するために正常に機能します。リンクされたリストに2番目のノードを挿入するために同じ関数を呼び出すと、行内の比較中に最初のノードにアクセスできません if(strcmp(sftemp->UFID,ufid)==0 )。コードの目的が明確になったことを願っています。

前もって感謝します..

4

2 に答える 2

1

whileでsftemp!=NULLかどうかをチェックするので、2 回目の繰り返しでsftemp=sftemp->next; の行の後に確認できます。ポインタには割り当てられたメモリが含まれています。

しかし、リストがどのように構成されているかがわからないため、コンテンツにsharedFilesタイプの別のノードが含まれているかどうかはわかりません。UFID属性を含まないエンド リスト ノードが含まれている可能性があります。

したがって、リストが終了したかどうかを制御する方法をリストで確認してください。

別の解決策は、チェックを次のように変更することです。

while(sftemp->next!=NULL)

...

if(sftemp->next==NULL) {
    //add the node in the right way, consider the end-list node
}

編集:

さらに、行sftemp->next = NULL;の場合は最初に変更します。to sfnext->next = NULL; .

また、必ずstnext = NULL を初期化してください。

編集2:

struct 宣言を投稿したので、いつsfstartを初期化するかまだわかりません。これを試してください:

Structure declaration:

struct sharedFiles
{
  char UFID[50];
  int valid;                    //valid 1 if someone have this file in write mode
  int shared;                   //no of user's reading this file
  struct sharedFiles *next;     //pointer to next node
}*sfstart = NULL,*sfend;
于 2013-03-06T13:53:29.247 に答える
0

通常、これに対する答えは、ポインターが NULL であるということです。これは、あなたの場合malloc、メモリ不足のために失敗したことを意味します。実際には戻り値を確認する必要があります。

問題の原因として最も可能性が高いのは、ヒープが破損しているためsftemp、有効なメモリ アドレスを指していないことです。より多くの手がかりを与える可能性のある値が何であるかを確認してください。

于 2013-03-06T13:49:59.173 に答える