-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

手册页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 回答