C語言是沒有字串類型的,一般通過字元指標或者字元數組進行操作。指標和數組的差別這裡就不講了。
首先說明下程式中變數在記憶體中的分布。
全域變數儲存在資料區段中,局部變數儲存在堆棧中,利用malloc動態分配的變數儲存在堆中。堆棧和堆的區別請google.
下面根據一個具體的程式來看。
代碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *s1,*s2,*s3;
void test()
{
char *p1 = "abc";
char *p2, p3[10];
p2 = malloc(10);
strcpy(p2, "abc");
strcpy(p3, "abc");
printf("static address:%p\n", &("abc"));
printf("p1 address:%p\n", p1);
printf("p2 address:%p\n", p2);
printf("p3 address:%p\n", p3);
s1 = p1;
s2 = p2;
s3 = p3;
}
int main(void)
{
test();
printf("s1=%s\n", s1);
printf("s2=%s\n", s2);
printf("s3=%s\n", s3);
return 0;
}
這裡進行了三種方式字串賦值
1.
char *p1 = "abc";
這裡怕p1指向了一個常量字串"abc",這個儲存在資料區段中,可以供全域使用。
2.
char *p2;
p2 = malloc(10);
strcpy(p2, "abc");
p2是通過malloc進行的動態記憶體分配而來的,儲存在堆中,可供全域使用,一般使用完要free掉,否則會導致記憶體流失。
3.
char p3[10];
strcpy(p3, "abc");
p3是數組名,這種方式產生的變數儲存在堆棧中,範圍是局部的。
在test函數被調用完成後,p3所定義的字串由於儲存在堆棧中,會被釋放掉,p1,p2所指向的字串非別儲存在資料區段和堆中,不會被釋放掉。
這也是為什麼printf("s3=%s\n", s3);不列印"abc"的原因。
最後給出程式的執行結果:
static address:0x80485cc
p1 address:0x80485cc
p2 address:0x9ffc008
p3 address:0xbffded10
s1=abc
s2=abc
s3=(íý¿Ð,
以上是個人的理解,有說的不對的地方,還請指正!
-------------
踏著落葉,追尋著我的夢想