C語(yǔ)言中沒(méi)有特定的字符串類(lèi)型,常用以下兩種方式定義字符串:一種是字符數(shù)組桑寨,另一種是指向字符串的指針伏尼。如下:
(1)char str[] = "happy";
(2)char *str = "happy";
這種方式有什么不同呢?
示例一:字符數(shù)組
#include <stdio.h>
int main(void)
{
char str[20] = "hello";
str[0] = 'H';
printf("%s\n",str);
return 0;
}
運(yùn)行結(jié)果:
Hello
示例二:指向字符串的指針
#include <stdio.h>
int main(void)
{
char *str = "hello";
str[0] = 'H';
printf("%s\n",str);
return 0;
}
運(yùn)行結(jié)果:
無(wú)打印信息輸出
可見(jiàn)尉尾,使用示例一方式定義的字符串其字符是可以修改的爆阶,使用示例二方式定義的字符串其字符是不可以修改的。示例二中可以成功編譯和鏈接沙咏,但運(yùn)行時(shí)可能會(huì)出現(xiàn)錯(cuò)誤辨图,我編譯壞境是32bit
的,運(yùn)行結(jié)果是無(wú)打印信息輸出肢藐,在其他不同的平臺(tái)運(yùn)行可能會(huì)出現(xiàn)段錯(cuò)誤(Segment Fault)
或者寫(xiě)入位置錯(cuò)誤故河。
這兩種表示字符串的方式的主要區(qū)別是:字符串指針指向的內(nèi)容是不可修改的,字符數(shù)組是可以修改的窖壕,即示例二方式定義的字符串保存在常量區(qū)忧勿,是不可更改的,示例一方式定義的字符串保存在全局?jǐn)?shù)據(jù)區(qū)或棧區(qū)瞻讽,是可修改的鸳吸。
內(nèi)存的分配方式:
內(nèi)存分配可分為三種:靜態(tài)存儲(chǔ)區(qū)、棧區(qū)速勇、堆區(qū)晌砾。
1、靜態(tài)存儲(chǔ)區(qū)
:該內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好烦磁,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在养匈,它主要存放靜態(tài)數(shù)據(jù)、全局?jǐn)?shù)據(jù)和常量都伪。
2呕乎、棧區(qū)
:它的用途是完成函數(shù)的調(diào)用。在執(zhí)行函數(shù)時(shí)陨晶,函數(shù)內(nèi)局部變量及函數(shù)參數(shù)的存儲(chǔ)單元在棧上創(chuàng)建猬仁,函數(shù)調(diào)用結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。
3、堆區(qū)
:程序在運(yùn)行時(shí)使用庫(kù)函數(shù)為變量申請(qǐng)內(nèi)存湿刽,在變量使用結(jié)束后再調(diào)用庫(kù)函數(shù)釋放內(nèi)存的烁。動(dòng)態(tài)內(nèi)存的生存期是由我們決定的,如果我們不釋放內(nèi)存诈闺,就會(huì)導(dǎo)致內(nèi)存泄漏渴庆。
關(guān)注我的公號(hào)【嵌入式大雜燴】,回復(fù):C語(yǔ)言雅镊,可獲取C語(yǔ)言資料襟雷。
關(guān)注我的個(gè)人博客:【我的博客】查看更多筆記