C中的字符串内存分配

时间:2013-09-22 18:46:29

标签: c arrays memory char

有人可以澄清这个吗?

char str[1];
strcpy(str, "HHHHHHHHHHHH");

这里我声明了一个大小为1的char数组,但是程序不会崩溃,直到我输入超过12个字符而且我只有一个数组大小。为什么呢?

2 个答案:

答案 0 :(得分:5)

此代码具有未定义的行为,因为它将多个元素写入str。它可以做任何。确保您只写入您拥有的内存是 的责任。

答案 1 :(得分:1)

这是未定义的行为。实际上,您会覆盖某些内存的内容。在这种情况下,如果它是局部变量,那么该数组将进入堆栈。你可能有一个堆栈增长的CPU架构,所以你开始覆盖其他局部变量,保存的寄存器值和函数调用的返回地址。

你可能首先覆盖了一些没有立竿见影的东西,或者你没有注意到这种影响。这可能是一个尚未初始化的局部变量,或者是一个局部变量或保存的寄存器值,在您覆盖它之后实际上没有使用它。

然后当你增加溢出的长度时,你可能损坏了函数返回地址,然后当你从函数返回时实际发生了崩溃。如果你有任何其他内存地址,那就是指针,崩溃也可能是因为你试图访问被破坏的指针所指向的值。

最后,如果你要增加足够的溢出大小,字符串复制最终将直接写在允许区域之外并导致立即崩溃(假设CPU和OS具有这种内存保护,而不是某些古代或嵌入式系统)。但这可能不是这里的原因,因为你在崩溃之前只写了14个字节。

但是请注意,从C语言的角度来看,上面是有点无意义的,未定义的行为,如果你在程序,编译器选项或输入数据中添加任何内容,它通常会发生变化。这可能会使内存损坏很难找到,因为添加调试通常会使问题“消失”(更改或隐藏症状)。