C++ 为什么一个声明为指向字符的指针并被分配了2字节大小的字符串的大小会被改变?

C++ 为什么一个声明为指向字符的指针并被分配了2字节大小的字符串的大小会被改变?,c++,c,string,pointers,memory-management,C++,C,String,Pointers,Memory Management,我在试验指针。最初,我创建了一个指向字符的指针,并为指针分配了2个字节的大小。然后我运行循环直到1000,分配一些值。当我尝试打印字符串时,它会给我一整套已分配的值 #include <iostream> #include <string.h> using namespace std; int main() { char *a = (char *)malloc(2); for (int i=0;i<10;i++) a[i]='a'

我在试验指针。最初,我创建了一个指向字符的指针,并为指针分配了2个字节的大小。然后我运行循环直到1000,分配一些值。当我尝试打印字符串时,它会给我一整套已分配的值

#include <iostream>
#include <string.h>

using namespace std;


int main()
{
    char *a = (char *)malloc(2);
    for (int i=0;i<10;i++)
       a[i]='a';
    cout<<a<<"\t"<<strlen(a)<<"\n";
    return 0;
}
<>我在C和C++中运行相同的代码。他们给了我同样的结果

首先,因为我使用了指针,所以[3]的平均值*&a+3:这就解释了为什么我能够给那个位置赋值。但是,即使我只为字符串分配了两个字节的内存,为什么我的字符串长度会变化呢?为什么编译器会以不同的方式运行?屏幕后面是什么

操作系统:OSX10.10.0 编译器:gcc | | g++ 架构:64位架构

Edit1:这与seg故障无关


Edit2:如果是因为strlen读取直到遇到空终止符。我没有在字符串末尾声明它。

这段代码在内存使用方面有问题。只分配了2个字节的内存,但使用了10个“是”。这将导致内存损坏。那么行为是未定义的


在您的情况下,最大i值可以是1而不是10。剩余的1 bye表示\0个字符。

在我尝试时,没有任何设置错误。当我使用最大值作为INT_MAXI的某个值时,产生了Seg故障。我只尝试了这个值。@iMinion谁说过Seg故障?当您开始使用未定义的行为时,不能保证您会被分段错误保存。@RedAlert我同意您的意见。我明白了,这种行为是没有定义的。我想知道发生了什么事。。答案解释了何时发生内存损坏。如果认为行为是未定义的,这将是自相矛盾的。如何才能很好地定义内存损坏?您不知道使用此代码修改的是谁的内存。后台发生的事情很简单,您正在写入未分配给a的内存。ReAdvices的问题是,为什么会发生这样的事情?C++编译器是如何工作的?即使我们知道它是未定义的,为什么结果不同?好吧,这不是为什么它不崩溃!这是关于为什么字符串的大小会被改变?strlen只计算连续字符的字节数,直到遇到空终止符为止。它不知道malloc,也不知道您为任何东西分配了多大的空间。所以,因为你在连续的内存区域中写了10个“a”,strlen至少会数到10。malloc分配的内存大小从未更改。你只是做了一些在内存的结尾写和读的东西。@ C或C++中的un死鱼,我们明确地声明了字符串的结尾。这是自相矛盾的。我不明白你的意思。您分配了特定大小的内存,但随后写入了该内存。C和C++不会阻止你做这些事情。实际上,一个程序的整个内存空间可以看作是一个大数组。C/C++在这之上强加了一套规则和想法,但是他们也希望程序员遵循这些规则。当您违反这些规则时,例如写入超过已分配内存的末尾,您可能会得到意外的结果。@TheUndeadFish感谢您的回复。只需遵守编译器的规则!我相信还有更多。我不能接受。谢谢你,朋友。
aaaaaaaaaa    10
  for (int i=0;i<1 /*10*/;i++)