Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
**glibc检测到***free():无效指针:0x0000000000400b2c_C - Fatal编程技术网

**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)
符合定义1
strncpy
用0填充缓冲区(在10的缓冲区中没有问题,在较大的缓冲区中可能会有问题),并且不保证
NUL
终止。您的
main
缺少
return
。如果你给出一个例子,试着写正确的C。这个例子是对OP给出的内容的编辑。我不能假设他希望从他的主要工作中获得的价值。至于你其余的论点,请详细说明你的陈述,并发布更好的代码。谢谢另外,strncpy当然不是NULL终止,它是一个内存函数,不是一个字符串类型感知函数,不管名称如何。字节是字符,根据定义是字节,所以sizeof(char)总是1,更好的实现是sizeof(*s)。在C语言中,强制转换malloc的结果是不必要的,并且可以隐藏其他错误(例如忘记定义malloc,导致malloc的隐式定义返回int),因此被认为是糟糕的形式。如果这有助于澄清问题,
malloc
的typecast结果为坏C.
sizeof(char)
根据定义1
strncpy
用0填充缓冲区(在10的缓冲区中没有问题,在较大的缓冲区中可能会有问题),并且不保证
NUL
终止。您的
main
缺少
return
。如果你给出一个例子,试着写正确的C。这个例子是对OP给出的内容的编辑。我不能假设他希望从他的主要工作中获得的价值。至于你其余的论点,请用e