C语言字符串存储实例解析

注: 本文参考了网络上部分资料,来源未知。如作者看到,请与我联系。


1.内存格式
长为n的字符串在内存中连续存放,每个字符存贮其ASCII码,占一个字节,共n个字节,最后填一个全0字节作为串的结束标志。空串也有一个字节,即只有结束标志字符'\0'。


2.程序中怎样存贮字符串

①用字符数组存贮串。
本质上,字符串是一种字符型数组,并且这个数组的最后一个单元的值是'\0';
也就是说,字符串是一种以'\0'结尾的字符数组。


例:char s[4]; /* 用字符串初始化一个字符数组*/

char s[41] = {"ABCD"};

char s[41] = "ABCD";

char s[41] = {'A','B','C','D','\0'};

②用字符串常量初始化一个字符指针变量建立串.
字符串常量就是用双引号括起来的一组字符;

char *s="ABCD";
"ABCD"是字符串常量,存放在程序的静态数据区,

s得到的是串"ABCD"的首地址,即字符A的存贮地址。

s[0]为'A',s[4] = 0

③用内存分配函数建立串

char *t;

t = (char *)malloc(81);

strcpy(t,"DEF");

……

free((void *)t);

3.几个例子:

(1)不可通过字符指针改变其指向的字符串常量的内容。

const char* pStr="Let it be what it can be, man!";
char StrArray[]="ABCDE";
printf("Str is %s\n", pStr);
*pStr="Hey,man!";
*(pStr+1) = "h";

编译error: (1)  invalid conversion from "const char *" to char;(2) assignment of read-only location..

点评:pStr是一个字符指针,指向字符串常量的内存首地址。*pStr对该指针解引用,实际为字符串常量的内容,即为字符。
而"Hey,man!"是另外一个字符串常量。无法将一个字符串常量强制转换为字符,实际意义为你不能改变一个常量字符串的内容。
对于*(pStr+1),道理雷同,不再赘述。

(2)可以改变字符指针的指向:
const char* pStr="Let it be what it can be, man!";
char StrArray[]="ABCDE";
printf("Str is %s\n", pStr);
pStr="Hey, Man!";

printf("Str is %s\n", pStr);


编译和运行可知,编译通过,且字符指针指向的内容有改变。

(3)可以改变字符数组的内容。

 const char* pStr="Let it be what it can be, man!";
   char StrArray[]="ABCDE";
   printf("Str is %s\n", pStr);
   pStr="Hey, Man!";
   printf("Str is %s\n", pStr);
   StrArray[0]='a';

   printf("Str Array Content is %s.\n", StrArray);


运行可知,字符数组第一个元素变为了小写a.

(4)不要返回指向栈内存的指针 :

char *GetMemory(void)
{
   char str[]="hello world"; //str数组创建在栈上,并用字符串常量来初始化.
//str是在栈上分配的内存,函数结束后将会自动释放,str指向的内存区域内容不是"hello world",而是未知的内容。
   return str; //该句存在隐患,str指向的内存单元将被释放
}

const char *Func(void)
{
   char *pCh="Test String";  //字符串常量存放在程序的静态数据区,
//pCh指针虽然是在栈上定义的,但当函数返回时,它指向的那个内存地址,也就是字符串“Test String”还是存在的,并没有被释放
    return pCh;  //返回字符串常量的地址,没有问题
}


  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值