C语言指针数组和二维数组的问题
涉及到数据是如何存储分布的。
一个程序在内存中的分布情况如下图所示:(图来自网络,很粗略的图但是可以用来说明)
char *str[12] = {"enter", "number"};
这样定义出来的数据分布情况,str这个指针数组存储在栈区,作为局部数据(如果是在函数内部定义)。若是定义为全局变量则该数据存储在.data区。注意这个数组存储的是指针,而这些指针实际指向的数据才是真正的字符串,而这个字符串是源代码经过编译器分析后,放置在只读数据区.rodata段(因为直接书写的字符串是const类型的,即常量类型的,常量类型不能被修改,下面会解释原因),在图上对应的是.text段(这里是图中被糅杂在一起了,实际上还是有.rodata的)。如果程序访问只读数据区的话,会经过段选择子(硬件的一个部件,类似寄存器的东西)的权限判断,因为只读数据区被填写为只能读不能写,因此执行过程中发生错误,向操作系统进行报告,最后得到一个异常或者说error。导致你执行错误。
而另一种写的方式:
char str[12][8] = {"enter", "number"};编译器分析出来,这个字符串是被定义并放置在栈区,作为局部数据,全局变量则在.data区。这个数组存的就不是指针了,而是字符串实体的数据,这个实体数据被放置在栈区或者.data区,在访问时段选择子发现这个区域是可读可写的,因此能够顺利进行改写而不会产生错误。
以上。
而二维数组里的字符所组成的字符串处于普通的栈空间,是可以修改的.
记住一点:char* s="abcd"; 实际上是 const char* s="abcd";
字符指针指向的字面字符串都是常量,不可修改。