C malloc总是返回null

时间:2012-11-30 11:58:25

标签: c pointers null malloc

所以我每次都得到这个错误,我似乎无法弄清楚在哪里解决它。

这是它始终返回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;

我之前在我的列表中创建完全相同代码的headnode工作原理! 编辑:阐述:

    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;
    }

所以上面的代码实际上创建了我的headnode。

编辑:记忆: 我有大量的内存可用:)

编辑:更多代码:

    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;
      }

我搜索了所有内容,但没有一个解决方案帮助了我,所以请帮助我们!

3 个答案:

答案 0 :(得分:3)

实际上,您之前已经使用缓冲区溢出来销毁堆。

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

这会导致malloc行为不端。做:

ptr -> cWord = malloc(strlen(temp) +1);//allocate
strcpy(ptr -> cWord, temp);//then copy

答案 1 :(得分:2)

你的问题中没有足够的信息可以正确回答,我很害怕。

此:

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

最好写成:

ptr = malloc(sizeof *ptr);

它更短,重复次数更少,removes the cast,并且通常更充满胜利。

但是,既然你说同一个代码在程序流程的早期工作,那么你的代码很可能在这里做正确的事情。

您分配了多少个节点?可能是某些递归失控,分配了数百万个节点并耗尽了你的记忆?

另请注意,您的标题与您的文字相矛盾,使这个问题更加令人困惑。

答案 2 :(得分:0)

来自malloc()的{​​{1}},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

如果这个最小代码示例失败后发布代码和文本文件的样本,如果它有效,那么你的大型程序中还有其他东西导致问题,你可以从那里“重新构建”并可能找到它