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,但底层报错,问题比较隐蔽。