关于char *和char []的个人理解

原创 2016年08月29日 23:51:13

今天白天练习一些编程题遇到了一个问题,是代码写好后总是莫名出现段错误,再三检查语法和算法,百思不得其解。
之后突然想到,可能是把char *和char[]搞混了。

原本应该是 char a[] = “hello”;
写成了char * a = “hello”;

在这之前我一直以为两者没有区别,然后仔细的思考了一番,发现了问题的所在。

一个linux进程分为几个部分(从一个进程的地址空间的低地址向高地址增长):
1.text段,就是存放代码,可读可执行不可写,也称为正文段,代码段。
2.data段,存放已初始化的全局变量和已初始化的static变量(不管是局部static变量还是全局static变量)
3.bss段,存放全局未初始化变量和未初始化的static变量(也是不区分局部还是全局static变量)
以上这3部分是确定的,也就是不同的程序,以上3部分的大小都各不相同,因程序而异,若未初始化的全局变量定义的多了,那么bss区就大点,反之则小点。
4.heap,也就是堆
5.stack,栈
6.再往上,也就是一个进程地址空间的顶部,存放了命令行参数和环境变量。

char * a = “hello” 初始化后,内容“hello”存放在存放在data段,在这个区域是代码编译后写在汇编里的不能改变,而指针变量的地址a存放在栈区,a是可以改变的。所以每次当试图对data区的内容进行操作是会报出段错误。

而char a[] = “hello”;初始化时,所有的数据都是在栈区初始化,内容是可变的。

以下为转自网络:

第一,如果是全局的和静态的
char *p = “hello”;
这是定义了一个指针,指向rodata section里面的“hello”,可以被编译器放到字符串池。在汇编里面的关键字为.ltorg。意思就是在字符串池里的字符串是可以共享的,这也是编译器优化的一个措施。
char a[] = “hello”;
这是定义了一个数组,分配在可写数据块,不会被放到字符串池。

第二,如果是局部的
char *p = “hello”;
这是定义了一个指针,指向rodata section里面的“hello”,可以被编译器放到字符串池。在汇编里面的关键字为.ltorg。意思就是在字符串池里的字符串是可以共享的,这也是编译器优化的一个措施。另外,在函数中可以返回它的地址,也就是说,指针是局部变量,但是它指向的内容是全局的。
char a[] = “hello”;
这是定义了一个数组,分配在堆栈上,初始化由编译器进行。(短的时候直接用指令填充,长的时候就从全局字符串表拷贝),不会被放到字符串池(同样如前,可能会从字符串池中拷贝过来)。注意不应该返回它的地址。

版权声明:本文为博主原创文章,未经博主允许不得转载。

关于char * c="hello"与char c[]="hello"的区别

转自:http://blog.sina.com.cn/s/blog_4c258ba00100eada.html http://www.cnblogs.com/thinkingfor/archive/...
  • ling620
  • ling620
  • 2014年03月18日 15:16
  • 947

关于char *和char [ ]

//在vc6.0   和.net下   通过 //结合黄瓜兄意思 #include using   namespace   std; void   main() { char   s1[]   = ...
  • hua_jian_chou
  • hua_jian_chou
  • 2010年12月27日 09:52
  • 99

char *与char []的区别

      其实,只要记住一点就能很好区分char *和char []:char *定义的是一个指向字符串的指针(注意:C语言中没有对应字符串的内置类型或者类类型),而char []就是C语言中的用来...
  • DayDreamingBoy
  • DayDreamingBoy
  • 2010年11月08日 15:16
  • 6822

关于char的理解

char类型用于表示单个字符。通常用来表示字符常量。例如:'A'是编码为65所对应的字符常量。Unicode编码单元可以表示为十六进制值,其范围从\u0000到\uffff。例如:\u03C0表示希腊...
  • dreamhyz
  • dreamhyz
  • 2015年11月13日 15:34
  • 378

数据库中NCHAR 、CHAR等的区别

对于程序中的string型字段,SQLServer中有char、varchar、nchar、nvarchar四种类型来对应(暂时不考虑text和ntext),开建立数据库中,对这四种类型往往比较模糊,...
  • tongailing
  • tongailing
  • 2011年04月01日 15:58
  • 5277

char *与char []类型的区别

参考文章:char *s 和 char s[] 的区别小结 char *s1 = "hello"; char s2[] = "hello";   【区别所在】 char *s1 的s1是指针...
  • u010275850
  • u010275850
  • 2016年11月10日 16:28
  • 1109

char *p = new char[256]; delete p; / delete[] p; 哪个对 为什么

原帖地址:http://topic.csdn.net/u/20071027/12/a31bf228-7b4f-40b2-be41-e3b859f643d4.html char *p = ne...
  • yahohi
  • yahohi
  • 2011年08月31日 20:41
  • 2116

c语言中 char* 和 unsigned char* 的区别浅析

背景最近在项目中遇到了一个编译警告,是因为定义的变量为char[],而在使用时作为函数的unsigned char*类型的参数调用。这个警告很容易避免,但是char*和unsigned char*到底...
  • guotianqing
  • guotianqing
  • 2017年08月17日 21:43
  • 904

【c语言】char无符号超范围的结果

// char无符号超范围的结果 #include int main() { unsigned char a = 200; unsigned char b = 100; unsigned ...
  • zhaoyaqian552
  • zhaoyaqian552
  • 2015年05月08日 17:18
  • 1133

char string 区别

这一篇要讲一个非常重要的话题:char类型与string类型的区别。从字面上说,他们是有区别的   1. char是字符类型   2. string是字符串类型   虽然一字之差,但其本质是很大...
  • ymd378362996
  • ymd378362996
  • 2012年05月26日 11:22
  • 13155
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于char *和char []的个人理解
举报原因:
原因补充:

(最多只允许输入30个字)