关于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”;
这是定义了一个数组,分配在堆栈上,初始化由编译器进行。(短的时候直接用指令填充,长的时候就从全局字符串表拷贝),不会被放到字符串池(同样如前,可能会从字符串池中拷贝过来)。注意不应该返回它的地址。

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

数据结构--二叉树--双亲、孩子和兄弟节点的查询(顺序结构)

#include /* EOF(=^Z或F6),NULL */ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 typ...

二叉树如何实现双亲结点及求树的高度

求二叉树的高度,可以用递归的思想去求解,也可以用非递归的思想去求解,只不过,递归的代码简单明了,但是总的来说,递归有递归的好处,非递归当然也有非递归的好处。 求树的高度的递归思想和递归建树的思想差不...

为什么char型指针可以直接赋值而其他类型的不行呢?个人见解

转自:http://blog.csdn.net/zyw_anquan/article/details/7790708 问题陈述: 通常大家会遇到这样的问题: char * p = "...
  • YHR14
  • YHR14
  • 2015年08月18日 11:09
  • 252

Java中char和String 的深入理解 - 字符编码1

看完你真的会清清楚楚明明白白的知道!!! 计算机世界 字符编码 的前世与今生!...

mysql 5.7中varchar 和 char的理解

做数据库设计,偶然间研究了一下varchar 和char  这两个东东  对于我这种渣渣连二进制字节都不懂的人理解起来还挺费劲,不过功夫不负有心人  理论上的知识从网上看的翻看了好多文章有的文章真是误...

深入理解const char

深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p...

理解c和c++的复杂类型声明(int *(*a[5])(int, char*);)

曾经碰到过让你迷惑不解、类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明。   我们将从每天都能碰到的...

[java]深入理解java中的char,unicode编码及其实现方式

众所周知,java中的char采用的是unicode编码(某一字符的该编码是固定不变的),其实现方式有utf-8、utf-16和utf-32。 在Unicode字符集中的某个字符对应的代码值(uni...
  • attwice
  • attwice
  • 2015年04月08日 22:41
  • 365

理解#define SREG (*(volatile unsigned char *)0x5F)

理解#define SREG (*(volatile unsigned char *)0x5F (2009-07-16 21:15)   理解#define SREG    (*(...
  • jinn3
  • jinn3
  • 2012年02月22日 11:14
  • 3397

关于main(int argc, char* argv[])的理解

以前对main函数中的参数设置有一些理解,以为很简单,不就是argc是参数数量,argv是字符串数组,但是昨天写多进程的问题确实碰到了麻烦,今天仔细想了想其中的问题还确实不少。其中涉及到的问题也是方方...
  • liuhuiyi
  • liuhuiyi
  • 2012年11月29日 15:59
  • 15749
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于char *和char []的个人理解
举报原因:
原因补充:

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