C語言中沒有特定的字符串類型,常用以下兩種方式定義字符串:一種是字符數(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é)果:
無打印信息輸出
可見,使用示例一方式定義的字符串其字符是可以修改的,使用示例二方式定義的字符串其字符是不可以修改的。示例二中可以成功編譯和鏈接,但運(yùn)行時(shí)可能會(huì)出現(xiàn)錯(cuò)誤,我編譯壞境是32bit的,運(yùn)行結(jié)果是無打印信息輸出,在其他不同的平臺(tái)運(yùn)行可能會(huì)出現(xiàn)段錯(cuò)誤(Segment Fault)或者寫入位置錯(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í)使用庫函數(shù)為變量申請(qǐng)內(nèi)存,在變量使用結(jié)束后再調(diào)用庫函數(shù)釋放內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期是由我們決定的,如果我們不釋放內(nèi)存,就會(huì)導(dǎo)致內(nèi)存泄漏。
關(guān)注我的公號(hào)【嵌入式大雜燴】,回復(fù):C語言,可獲取C語言資料。
關(guān)注我的個(gè)人博客:【我的博客】查看更多筆記