c语言怎么定义字符串:字符数组和字符指针是主流定义写法

c语言怎么定义字符串:字符数组和字符指针是主流定义写法

上周机房上机敲代码时,盯着编译器报错弹窗反复琢磨c语言怎么定义字符串,旁边同桌敲完代码转头打趣,说连着三次编译失败纯粹是分不清数组和指针的写法,指尖在键盘上来回删改,一会加中括号一会添星号,控制台总跳出乱码或者越界警告。

一开始全靠死记硬背符号。

没吃透结束符规则的那段日子,踩过最多的坑就是自定义数组长度时没预留终止位,最开始随手写下char str[3]="abcd",总觉着引号里四个字符刚好填满数组空间,完全忘了C语言字符串会自动在末尾补一个'\0'用来标记结束,在调试窗口打开内存监视面板,能看见数组后续跟着一堆随机的垃圾数据,调用puts函数输出的时候,屏幕源源不断蹦出莫名字符,在机房里耗了将近一节课,一会把数组下标改成5留出富余空间,一会手动在数组末尾单独添加结束字符,中途脑子一乱还混着指针语法乱写,一会去掉中括号添上星号,一会又把指针赋值套在数组变量上,代码排版乱糟糟,编译侥幸通过,运行结果依旧飘忽不定,就是没分清两种定义方式在内存存储上的区别,总以为只差一个符号,实际运行效果不该出现这么大落差,反复改动的过程里,还在在注释里胡乱标注自己臆想出来的语法规则,越记越混乱。

邻座学长路过机位,随手敲了两行示范代码,数组形式定义出来的字符串存放在栈内存,能自由修改内部字符,双引号包裹的常量字符串存放在只读常量区,指针变量只存储这块空间的起始地址,这一点在那之前完全没放在心上,之前试着用指针修改字面量里的单个字符,程序直接触发段错误闪退,盯着黑屏的调试终端愣了好久,从前一直以为只要能完成赋值就是合法的字符串定义,压根忽略常量区内容不允许改写这个硬性约束。

试过逐个字符初始化数组来搭建字符串,char buf[6]={'h','e','l','l','o','\0'};,手动补齐末尾的结束标记,这种写法在字符数量少的场景还算稳妥,就是每次手写都要惦记末尾的零字符,偶尔粗心漏掉,strlen、strcpy这类字符串处理函数全都没法正常识别字符串边界,计算长度的时候会疯狂向后读取内存。

不带数值的数组初始化算是日常最常用的写法,char msg[]="test";,编译器会自动统计引号内字符再加一个结束符来分配内存,省去手动核算数组大小的麻烦,平时写小测试代码基本都选这个格式,可正式写项目代码的时候,反倒更偏向固定长度的数组写法,能人为管控内存占用,避免无意间数组扩容造成多余开销。

偶尔赶作业图省事,直接用char *s="固定文本";来定义字符串,省事是省事,但绝不能在代码里修改指针指向的内容,上次期末实训作业就是栽在这个细节上,想要替换字符串中间一个汉字,直接写下*s='k',程序运行瞬间直接闪退,对着报错日志一点点排查大半天才锁定出错位置。

慢慢试错之后摸准选用逻辑,后续需要修改字符串里的内容就选用字符数组做定义,只做读取输出不改动内容就选用字符指针接收常量字符串,很少再盲目混用两种写法,代码报错的频次肉眼可见降了下来。

当晚回宿舍躺床上,脑子里还在复盘白天写错的几行代码,随手在草稿纸上胡乱罗列两种定义格式。

了解更多百科知识请访问 百科