C语言指针数组和二维数组的问题

如图所示两张图,为什么当定义为*str[12]时strcpy(str[0],str[1])是错误的;但是当定义为str[12][8]时,strcpy(str[0],str... 如图所示两张图,为什么 当定义为*str[12]时strcpy(str[0],str[1])是错误的;但是当定义为str[12][8]时,strcpy(str[0],str[1])是正确的? 展开
 我来答
free逍遥星空
2017-07-12 · TA获得超过344个赞
知道小有建树答主
回答量:231
采纳率:100%
帮助的人:206万
展开全部

涉及到数据是如何存储分布的。

一个程序在内存中的分布情况如下图所示:(图来自网络,很粗略的图但是可以用来说明)

char *str[12] = {"enter", "number"};

这样定义出来的数据分布情况,str这个指针数组存储在栈区,作为局部数据(如果是在函数内部定义)。若是定义为全局变量则该数据存储在.data区。注意这个数组存储的是指针,而这些指针实际指向的数据才是真正的字符串,而这个字符串是源代码经过编译器分析后,放置在只读数据区.rodata段(因为直接书写的字符串是const类型的,即常量类型的,常量类型不能被修改,下面会解释原因),在图上对应的是.text段(这里是图中被糅杂在一起了,实际上还是有.rodata的)。如果程序访问只读数据区的话,会经过段选择子(硬件的一个部件,类似寄存器的东西)的权限判断,因为只读数据区被填写为只能读不能写,因此执行过程中发生错误,向操作系统进行报告,最后得到一个异常或者说error。导致你执行错误。


而另一种写的方式:

char str[12][8] = {"enter", "number"};编译器分析出来,这个字符串是被定义并放置在栈区,作为局部数据,全局变量则在.data区。这个数组存的就不是指针了,而是字符串实体的数据,这个实体数据被放置在栈区或者.data区,在访问时段选择子发现这个区域是可读可写的,因此能够顺利进行改写而不会产生错误。


以上。

庄政警
2017-07-12 · TA获得超过9916个赞
知道大有可为答主
回答量:1113
采纳率:94%
帮助的人:886万
展开全部
char* str[12]={"abcd","1234"....}; //str[0],str[1]这些指针元素所指向的"abcd","1234"这些字符串处于内存空间的常量区,是常量字符串,是不允许修改的,所以strcpy会出错
而二维数组里的字符所组成的字符串处于普通的栈空间,是可以修改的.
记住一点:char* s="abcd"; 实际上是 const char* s="abcd";
字符指针指向的字面字符串都是常量,不可修改。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wu...g@163.com
2017-07-12 · TA获得超过285个赞
知道小有建树答主
回答量:481
采纳率:45%
帮助的人:95万
展开全部
胜日寻芳泗水滨,无边光景一时新.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式