用free()编程程序

时间:2016-02-12 22:19:37

标签: c

嗨,伙计们,你们可以帮助我,我试图从输入中获取文本并将其保存到字符串,其大小取决于输入,所以我分配了它,但是当我尝试释放内存错误时,我试图将它删除但是我坚持了这里。如果没有free(),它会正常结束,我尝试使用linux并执行,但在视觉工作室问题出现时,我应该担心吗?

调试器坚持这个 / * *如果此ASSERT失败,则传入错误的指针。可能是 *完全是假的,或者它可能是从另一个堆分配的。 *指针必须来自'本地'堆。 * / _ASSERTE(_CrtIsValidHeapPointer(pUserData));

int unosUBuffer(char *tmpBuffer,int spaceCounter)
{
   int i = 0;
   int input = ' ';
  do 
  {
   input = getchar();

    if(input ==' ') 
    {
    spaceCounter ++; 
    }

    tmpBuffer = (char*)realloc(tmpBuffer,(sizeof(char))* i+1);
    tmpBuffer[i] = input;
    i++; 
  }while(tmpBuffer[i-1] != '\n');

   tmpBuffer[i-1] = '\0';
   return spaceCounter;
}

int main(int argc, char *argv[])
{
   int spaceCounter = 0;
   char *tmpBuffer;
   char *line;

   tmpBuffer = (char*)malloc(sizeof(char)); 
   welcomeScreen(); 
   spaceCounter = unosUBuffer(tmpBuffer, spaceCounter);
   printf("\n space counter = %d", spaceCounter);

   free(tmpBuffer);

   return 0;
}

Sry们我用错误的函数名称粘贴错误的代码,函数unosUBuffer()和inputBuffer()是相同的函数,它的unosUBuffer()。

1 个答案:

答案 0 :(得分:3)

可以通过指定tmpBuffer的返回值来更改inputBuffer()中的{p> realloc(),但main()将无法知道新值,并尝试释放旧版本缓冲区是。 旧缓冲区可能已被realloc()释放,再次释放它可能会导致崩溃。

你应该让参数tmpBuffer成为char*的指针,让main()知道新缓冲区的位置。