首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >华润报告无效

华润报告无效
EN

Stack Overflow用户
提问于 2014-06-27 17:53:55
回答 1查看 1.7K关注 0票数 2

我正在努力补充我对C内存管理的知识。我主要来自脚本和托管背景,我想了解更多关于C和C++的知识。为此,我读了几本书,其中一本包括了使用realloc修剪一系列空格的示例:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* trim(char* phrase)
{
  char* old = phrase;
  char* new = phrase;

  while(*old == ' ') {
    old++;
  }

  while(*old) {
    *(new++) = *(old++);
  }

  *new = 0;

  return (char*)realloc(phrase, strlen(phrase)+1);
}

int main ()
{
  char* buffer = (char*)malloc(strlen("  cat")+1);
  strcpy(buffer, "  cat");

  printf("%s\n", trim(buffer));

  free(buffer);
  buffer=NULL;

  return 0;
}

我忠实地复制了这个示例,并使用c99 -Wall -Wpointer-arith -O3 -pedantic -march=native进行了编译。我没有收到任何编译错误,该应用程序运行并执行了书中承诺的内容,但当我针对val差利运行它时,我会得到一个关于无效realloc的错误。

代码语言:javascript
复制
==21601== Memcheck, a memory error detector
==21601== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==21601== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==21601== Command: ./trim
==21601== 
==21601== Invalid free() / delete / delete[] / realloc()
==21601==    at 0x402B3D8: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==21601==    by 0x804844E: main (in /home/mo/programming/learning_pointers/trim)
==21601==  Address 0x4202028 is 0 bytes inside a block of size 6 free'd
==21601==    at 0x402C324: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==21601==    by 0x80485A9: trim (in /home/mo/programming/learning_pointers/trim)
==21601==    by 0x804842E: main (in /home/mo/programming/learning_pointers/trim)
==21601== 
==21601== 
==21601== HEAP SUMMARY:
==21601==     in use at exit: 4 bytes in 1 blocks
==21601==   total heap usage: 2 allocs, 2 frees, 10 bytes allocated
==21601== 
==21601== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==21601==    at 0x402C324: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==21601==    by 0x80485A9: trim (in /home/mo/programming/learning_pointers/trim)
==21601==    by 0x804842E: main (in /home/mo/programming/learning_pointers/trim)
==21601== 
==21601== LEAK SUMMARY:
==21601==    definitely lost: 4 bytes in 1 blocks
==21601==    indirectly lost: 0 bytes in 0 blocks
==21601==      possibly lost: 0 bytes in 0 blocks
==21601==    still reachable: 0 bytes in 0 blocks
==21601==         suppressed: 0 bytes in 0 blocks
==21601== 
==21601== For counts of detected and suppressed errors, rerun with: -v
==21601== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

所以请帮我理解为什么它被认为是无效的不动产。这个例子是垃圾吗?我遗漏了什么吗?我知道,根据规范,realloc希望指针是先前由malloc创建的,那么是因为realloc在另一个函数中吗?还是因为他们在不同的功能中而困惑?我不是一个完全的白痴(大多数日子),但现在我觉得自己好像一个没有看到问题的人。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-27 17:58:13

您正在尝试free原始指针,而不是reallocd指针。你可以通过以下方法来修复它:

代码语言:javascript
复制
buffer = trim(buffer)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24458075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档