**glibc检测到***free():无效指针:0x0000000000400b2c
考虑以下代码:**glibc检测到***free():无效指针:0x0000000000400b2c,c,C,考虑以下代码: int main() { char* s = (char*) malloc(sizeof(char)*10); s="hello"; free(s); } 执行此程序时,我收到一个错误: ** glibc detected *** free(): invalid pointer: 0x0000000000400b2c **glibc检测到***free():无效指针:0x0000000000400b2c 我对这个错误的研究表明,它可能是由于没有通过mal
int main()
{
char* s = (char*) malloc(sizeof(char)*10);
s="hello";
free(s);
}
执行此程序时,我收到一个错误:
** glibc detected *** free(): invalid pointer: 0x0000000000400b2c
**glibc检测到***free():无效指针:0x0000000000400b2c
我对这个错误的研究表明,它可能是由于没有通过
malloc()
分配足够的内存空间造成的。但是程序已经调用了malloc()
,为10个char
s产生了足够的空间。传递给free()
任何不是来自malloc()
的内容都是错误的
将
“hello”
分配给s
,然后试图释放它违反了此规则。传递给free()
任何不是来自malloc()
的内容都是错误的
将
“hello”
分配给s
,然后试图释放它违反了此规则。错误在于您正在释放不属于自己的内存。您正在释放字符串文字,而不是通过malloc/new&co显式创建的内存。错误在于您正在释放您不拥有的内存。您正在释放字符串文字,而不是通过malloc/new&co.显式创建的内存请求。之后:
s="hello";
s
不再指向动态分配的内存。它指向字符串literal“hello”
。你不能释放它,因为它最初不是malloc
ed。你已经泄露了这个分配,因为你不再有指向它的指针了
查看strncpy
函数,将一个C字符串复制到另一个C字符串。之后:
s="hello";
s="hello";
s
不再指向动态分配的内存。它指向字符串literal“hello”
。你不能释放它,因为它最初不是malloc
ed。你已经泄露了这个分配,因为你不再有指向它的指针了
查看strncpy
函数将一个C字符串复制到另一个C字符串
s="hello";
您正在将另一个地址分配给静态分配的内存。释放它是不正确的。此外,由于您正在这样做,您基本上正在泄漏您在此处分配的内存:
char* s = (char*) malloc(sizeof(char)*10);
尝试:
您正在将另一个地址分配给静态分配的内存。释放它是不正确的。此外,由于您正在这样做,您基本上正在泄漏您在此处分配的内存:
char* s = (char*) malloc(sizeof(char)*10);
尝试:
您正在将
s
从malloc
'd指针重新分配到常量字符串文字,然后尝试释放。由于字符串文本没有分配给malloc
,free
,因此不出意料的是,使用它会导致不好的结果
哦,我看到你已经投下了《malloc的回归》。如果你用的是C,你不应该这样做;如果你使用C++,那么你应该使用<代码>新的< /代码> />代码>删除< /> >而不是<代码> Malc /Cuth>免费< /C> > 你正在从<代码> MaloC/<代码>指针中重新分配<代码> S/<代码>一个常数字符串文字,然后尝试<代码>免费< /C>。由于字符串文本没有分配给malloc
,free
,因此不出意料的是,使用它会导致不好的结果
哦,我看到你已经投下了《malloc的回归》。如果你用的是C,你不应该这样做;如果你使用C++,那么你应该使用<代码>新< /Calp>/Cudio> < /COD> >而不是<代码> Malc /Cuth> Fue< /Cuff>。< /P>这不是现代C++的样子,即使它是有效的C++。学习并学习适当的C++。例如,在C++中,使用C++“>代码> > STD::String C++类,而不是使用<代码> MARROCKE()/Cudio>,只需指出,问题是C相关的,而不是C++ +EddieByth:问题最初只标注C++。我不确定我赞成用它标记的C的编辑,它引入了另一个问题,它的结果是 MalOC<<代码>。这不是现代C++的样子,即使它是有效的C++。学习并学习适当的C++。例如,在C++中,使用C++“>代码> > STD::String C++类,而不是使用<代码> MARROCKE()/Cudio>,只需指出,问题是C相关的,而不是C++ +EddieByth:问题最初只标注C++。我不确定我是否同意将其标记为C的编辑,这会在转换malloc
的结果时引入另一个问题。malloc
结果的类型转换是不好的C。sizeof(char)
符合定义1strncpy
用0填充缓冲区(在10的缓冲区中没有问题,在较大的缓冲区中可能会有问题),并且不保证NUL
终止。您的main
缺少return
。如果你给出一个例子,试着写正确的C。这个例子是对OP给出的内容的编辑。我不能假设他希望从他的主要工作中获得的价值。至于你其余的论点,请详细说明你的陈述,并发布更好的代码。谢谢另外,strncpy当然不是NULL终止,它是一个内存函数,不是一个字符串类型感知函数,不管名称如何。字节是字符,根据定义是字节,所以sizeof(char)总是1,更好的实现是sizeof(*s)。在C语言中,强制转换malloc的结果是不必要的,并且可以隐藏其他错误(例如忘记定义malloc,导致malloc的隐式定义返回int),因此被认为是糟糕的形式。如果这有助于澄清问题,malloc
的typecast结果为坏C.sizeof(char)
根据定义1strncpy
用0填充缓冲区(在10的缓冲区中没有问题,在较大的缓冲区中可能会有问题),并且不保证NUL
终止。您的main
缺少return
。如果你给出一个例子,试着写正确的C。这个例子是对OP给出的内容的编辑。我不能假设他希望从他的主要工作中获得的价值。至于你其余的论点,请用e