1:char p[] = "hello word";

2:char* p = "hello word";

3:char* p = new char[100];strcpy(p,"hello word");

应该说对于char的赋值也就这三种情况了。

这三种情况p对应的值应该放在不同的,

1 放在函数栈中,

2 放在静态区中

3 放在堆中,

因为2的内存是不可以写操作的,所以也不存在越界写,你要是写了虽然编译能过,但会segment fault1的情况是最危险的;

由于1中char p[] 这个赋值就确定了大小,所以要是追加写就是越界写了。但这种程序会继续执行,但此时p结构已经完全被破坏了,所以程序会莫名的出一些错误。

3 也有这样的情况,要是你写的超过100bytes。

最后说下linux下内存申请的原理。当我们new char[10]的时候,其实系统分配的会大于10,因为系统要记录这次分配的大小,一般这些系统都是在分配的尾部,这就可以解释为什么我们越界了仍可以写,我们的rewrite了这些信息了,当我们在用到这快内存的信息的时候。自然会出错,这也是我们new 完 delete []p 的时候为什么我们不用告诉系统我们要delete多少个的原因。因为系统能找到。

 

           C语言中内存越界,如1300BYTE长的报文传到定长1024BYTE的内存中,没有CORE,但底层报错,问题比较隐蔽。