char* str和char str[]的区别

本文详细介绍了C++中char *str和char str[]的区别,强调了它们在内存分配上的不同。char str[]在栈上分配,可修改;char *str指向常量区,不可修改。同时,文章阐述了程序内存分配的五个部分,重点讨论了栈和堆的特点,包括申请方式、大小限制、效率比较和存储内容。最后提到了在Windows下使用Virtual Alloc进行内存分配的优势。

       char str[]="abcdef",这个数组的存储空间是在栈中开辟的,也就是说它的每个元素一次为'a','b','c','\0',将这几个值复制到str的位置中。

      对于char *str="abcdef",str指向的是静态存储区,"abcdef"是位于常量区的,指针str只是指向了这个位置。注意:它与上面的复制不是一回事。既然位于常量区,那么这些值就不能被修改。而上面数组中,要注意的是把字符复制到数组的元素中,那么就是可以被任意修改的。

所以将程序中的char *str="abcdef"改为char str[]="abcdef",运行便正确了~

更进一步地引出内存分配的概念:

首先要高清楚编译程序占用的内存分区形式:

一、预备知识----程序的内存分配

一个由C/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域;未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

4、文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。

5、程序代码区

这是网上找的例程,非常详细:

View Code

  
vo>curl -X POST "https://eci-2zecjsc015lo3ur1s4pz.cloudeci1.ichunqiu.com/" -d "cipher=dW91dGlhKCdrbXQgL2hibWcudHB0IDI+L2ppci96c2JiJyk7" <code><span style="color: #000000"> <br />highlight_file</span><span style="color: #007700">(</span><span style="color: #0000BB">__FILE__</span><span style=<br /></span><span style="color: #0000BB">$cipher&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'cipher'</span><span style=<br />function&nbsp;</span><span style="color: #0000BB">atbash</span><span style="color: #007700">(</span><span style="c<br />&nbsp;&nbsp;</span><span style="color: #0000BB">$result&nbsp;</span><span style="color: #007700">=&nbsp;</span><sp<br />&nbsp;&nbsp;foreach&nbsp;(</span><span style="color: #0000BB">str_split</span><span style="color: #007700">(</span><span style="color: #0000BB">$text</span><span style="color: #007700">)&nbsp;as&nbsp;</span><span style="color: #0000BB<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">ctype_alpha</span><span style="color: #007700<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$is_upper&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ctype_upper</span><span style="color: #007700">(</span><span style="<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$base&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$is_upper&nbsp;</span><span style="color: #007700">?&nbsp;</span><span style="color: #0000BB">ord</span><span style="color: #007700">(</span><span style="color: #DD0000">'A'</span><span style="color: #007700">)&nbsp;:&nbsp;</span><span style="color: #0000BB">ord</span><span style="color: #007700">(</span><span <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$offset&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ord</span><span style="color: #007700">(</span><span style="color: #0000BB">strtolower</span><span style="color: #007700">(</span><span style="color: #0000BB">$char</span><span style="color: #007700">))&nbsp;-&nbsp;</span><span style="color: #0000BB">ord</span><span style="color: #007700">(</span><span style=<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$new_char&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">chr</span><span style="color: #007700">(</span><span style="color: #0000BB">$base&nbsp;</span><span style="color: #007700">+&nbsp;(</span><span style="color: #0000BB">25&nbsp;</span><span <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$result&nbsp;</span><span style="color: #0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$result&nbsp;</span><span style="color: #0<br />&nbsp;&nbsp;</span><span style="color: #0000BB">$cipher&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">base64_decode</span><span style="color: #007700">(</span><span style="color: #0000BB">$cipher<<br />&nbsp;&nbsp;</span><span style="color: #0000BB">$encoded&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">atbash</span><span style="color: #007700">(</span><span style="color: #0000BB">$cipher</span><br />&nbsp;&nbsp;</span><span style="color: #0000BB">$encoded&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">str_replace</span><span style="color: #007700">(</span><span style="color: #DD0000">'&nbsp;'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">''</span><span style="color: #007700">,&nb<br />&nbsp;&nbsp;</span><span style="color: #0000BB">$encoded&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">str_rot13</span><span style="color: #007700">(</span><span style="color: #0000BB">$encoded</s<br /></span><span style="color: #0000BB">$question&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="<br /></span><span style="color: #0000BB">$answer&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="co<br /></span><span style="color: #0000BB">$res&nbsp;</span><span style="color: #007700">=&nbsp;&nbsp;</span><span style="color: #0000BB">$question&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"<br>"&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$answer&nbsp;</span><span style=<br />echo&nbsp;</span><span style="color: #0000BB">$res&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$res&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$res&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$res&nbsp;</span><span style="color: #007<br /></span><span style="color: #0000BB">?></span>span><span style="color: #007700">; </span> </code><br /> <b>Parse error</b>: in <b>/var/www/html/index.php(27) : eval()'d code</b> on line <b>1</b><br />
最新发布
10-07
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值