2011-09-09 76 views
1

考虑下面的代码:**的glibc ***免费():无效的指针:0x0000000000400b2c

int main() 
{ 
    char* s = (char*) malloc(sizeof(char)*10); 
    s="hello"; 
    free(s); 
} 

当执行这个节目,我得到一个错误:

** glibc detected *** free(): invalid pointer: 0x0000000000400b2c

我的研究在这错误表示可能是由于未通过malloc()分配足够的内存空间而导致的。但是该程序已经调用malloc(),产生了足够的空间用于10 char s。

+0

这不是现代C++的样子,尽管这是有效的C++。拿起[一本关于C++的好书籍介绍](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)并学习适当的C++。例如,不用'malloc()',你可以在C++中使用'std :: string'类的优越性和易用性。 –

+0

只是指出,问题是C相关,而不是C++ – EddieBytes

+0

@EddieBytes:问题最初只是标记为C++。我不确定我是否赞同将它标记为C的编辑,这引入了另一个与'malloc'结果相关的问题。 – Mat

回答

10
s="hello"; 

您正在为s分配另一个地址给静态分配的内存。释放它是不正确的。此外,因为你这样做,你基本上是泄露你在这里分配的内存:

char* s = (char*) malloc(sizeof(char)*10); 

尝试:

int main() 
{ 
    static const size_t kBufferSize = 10; 
    char* s = (char*) malloc(sizeof(char) * kBufferSize); 
    strncpy(s,"hello", kBufferSize); // better than strcpy, you are protecting 
          // yourself from a buffer overflow 
    free(s); 
} 
+1

'malloc'result的类型转换不好C.'sizeof(char)'是每个定义1。'strncpy'用0填充缓冲区(在10的缓冲区中没有问题,在更大的缓冲区中它可能是个问题),并且不保证'NUL'终止。你的'main'没有'return'。如果你举一个例子,试着写出正确的C。 –

+0

这个例子是对OP给出的内容的编辑。我不能认为他希望从主队回归的价值。至于其余的论点,请详细说明你的陈述并发布更好的代码。谢谢。另外,strncpy当然不会NULL终止,它是一个内存函数,而不是一个字符串类型的感知函数,尽管名字。 – EddieBytes

+3

一个字节是一个字节,根据定义,所以sizeof(char)将始终为1,更好的实现将是sizeof(* s)。在C中,转换malloc的结果是不必要的,并且可以隐藏其他错误(例如忘记定义malloc,导致malloc的隐式定义返回int),因此被认为是不正确的形式。如果这有助于清理事情。 –

1

传递到free()任何不是来自malloc()的错误。

"hello"指定为s然后尝试释放它违反了此规则。

0

错误在于你正在释放你不拥有的内存。您正在释放一个字符串,而不是明确创建的内存通过的malloc /新&共同要求..

9

后:

s="hello"; 

s不再指向你动态分配的内存。它指向字符串文字"hello"。你不能免费的,因为它不是第一个编辑的malloc。你已经泄漏了这个分配,因为你不再有指针了。

看看strncpy函数将一个C字符串复制到另一个。

2

您重新分配smalloc“d指向一个常量字符串字面,然后您尝试free。由于字符串文字没有被分配到mallocfree并不令人惊讶地导致不好的事情。

哦,我看你已经投了malloc的回报。如果你使用C,你不应该这样做;如果您使用的是C++,那么您应该使用new/delete而不是malloc/free

相关问题