-2

そのため、毎回このエラーが発生しているため、どこで解決すればよいかわかりません。

これは、常に null を返す場所です。

    wordData * ptr;
    ptr = (wordData*)malloc(sizeof(wordData)); //returns null every time
    if(NULL == ptr)
    {
       printf("\n Node creation failed in add list\n");
       return NULL;
    }

これは私の構造体です:

    typedef struct _wordData
    {
        int iWordID;
        char * cWord;
        struct _wordData *next;

     } wordData;

しかし、まったく同じコードで以前にリストにヘッドノードを作成すると、機能します! 編集:詳細:

    printf("\n creating list with headnode as [%d] %s\n",iWordID,cWord);
    wordData *ptr;
    ptr = (wordData*)malloc(sizeof(wordData));
    if(NULL == ptr)
    {
       printf("\n Node creation failed in create list \n");
       return NULL;
    }

したがって、上記のコードは実際にヘッドノードを作成します。

編集:メモリ上:利用可能なメモリがたくさんあります:)

編集:より多くのコード:

    void clearStr() // adding word into list with a struct containing word,wordID
    {
      add_to_list(iID,cStr,true);
      memset(cStr, '\0', sizeof(cStr) );
      iCounter = 0;
    }


    wordData* add_to_list(int iWordID, char * cWord, bool add_to_end)
    {
      char temp[strlen(cWord)+1];
      strcpy(temp, cWord);
      if(NULL == head)
      {
          return (create_list(iWordID, temp));
      } 

      if(add_to_end)
      printf("\n Adding node to end of list with iWordID [%d] %s\n",iWordID, cWord);
      else
      printf("\n Adding node to beginning of list with iWordID [%d]\n",iWordID);

      int sizeWordData = sizeof(wordData);
      printf("Size wordData is: %d",sizeWordData); //12 every time

      wordData * ptr;
      ptr = (wordData*)malloc(sizeof(wordData)); //waarom is dit null?
      if(NULL == ptr)
      {
         printf("\n Node creation failed in add list\n");
         return NULL;
      }

      ptr->iWordID = iWordID;
      ptr -> cWord,temp;
      strcpy(ptr -> cWord, temp);
      ptr->next = NULL;

      if(add_to_end)
      {
        curr->next = ptr;
        curr = ptr;
        printf("pointers geset");
      }
      else
      {
        ptr->next = head;
        head = ptr;
      }
      return ptr;
      }

私はすべてを検索しましたが、与えられた解決策のどれも私を助けてくれなかったので、助けていただければ幸いです!

4

3 に答える 3

3

実際には、以前にバッファオーバーランでヒープを破壊しました。

strcpy(ptr -> cWord, temp);//without allocating anything to cWord

これにより、mallocが誤動作します。行う:

ptr -> cWord = malloc(strlen(temp) +1);//allocate
strcpy(ptr -> cWord, temp);//then copy
于 2012-11-30T12:11:39.423 に答える
2

あなたの質問には適切に答えるのに十分な情報がありません。

これ:

ptr = (wordData*)malloc(sizeof(wordData)); //returns null every time

次のように書く方が良いです:

ptr = malloc(sizeof *ptr);

それは短く、繰り返しが少なく、キャストを削除し、一般的に勝利に満ちています.

ただし、同じコードがプログラム フローの早い段階で機能すると言うので、コードがここで正しいことを実行している可能性があります。

いくつのノードを割り当てますか? いくつかの再帰が手に負えなくなり、何百万ものノードが割り当てられ、メモリが使い果たされている可能性がありますか?

また、タイトルがテキストと矛盾しているため、この質問がさらに混乱していることにも注意してください.

于 2012-11-30T12:08:08.207 に答える
0

戻ることができる2つの時間があるためのmanページから:malloc()malloc()NULL

  • サイズが合えば0返品可能NULL
  • メモリの要求が失敗した場合

あなたHow ever when I create the headnode in my list earlier on the exact same code worksは、問題を含む可能性のあるあなたの例に何かが欠けていることを意味します:

ptr = (wordData*)malloc(sizeof(wordData)); 
                             ^
                         this should never be 0, so that shouldn't be the problem

プログラムにループや再帰呼び出しはありませんか? 割り当ては何回行いますか?

編集:
ファイルから読み取っているだけだと言うので、これを試してください:

main()
  open file
  loop for length of file
     allocate your memory
  free memory

この最小限のコード例が失敗した場合は、コードとテキスト ファイルのサンプルを投稿してください。それが機能する場合は、大規模なプログラムに問題を引き起こしている何かがあり、そこから「元に戻す」ことができ、おそらくそれを見つけることができます。

于 2012-11-30T12:08:31.823 に答える