C語言字串初探

來源:互聯網
上載者:User

  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=(íý¿Ð,

 

 

以上是個人的理解,有說的不對的地方,還請指正!

 

  ------------- 踏著落葉,追尋著我的夢想

 

 

 

 


 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.