字串二重指標為什麼需要動態分配空間

2021-08-20 16:24:05 字數 1665 閱讀 4875

指標的概念:建立乙個指標型別的資料,在64位系統中,乙個指標型別的資料用8個位元組表示。指標型別的資料儲存某個資料的位址。編譯器,可以根據指標位址處理該位址的資料。

首先考慮字串的儲存模型,如下圖所示。字串變數s其實是儲存了字串首字母的位址,指標p為字串首字母的位址。

輸出字串時,printf(),讀入的位址認為是字串的首位址,遇到「\0」,認為時字串的結束。程式執行**如下圖所示。

#include #include int main(void)
輸出結果:

s:abcdefgh

字串指標初始化時,指定的是字串常量,且字串常量儲存在**區中,以後沒法更改。可能是因為字串常量,所以不需要為指標s分配記憶體。但如果字串指標指向的不是字串常量呢?

#include #include #include int main(void)
在上面的**中,將字串」123456「複製,並用指標p指向複製後的字串,執行程式,結果出現段錯誤。

如果取消注釋的那行,為p在堆中分配7個位元組的記憶體,則程式可正常輸出如下:

s:123456

所以呢,對於一重字串指標來說,如果在初始化時指向字串常量,就需要不在堆中分配空間,畢竟已經在**塊有個儲存位置。但如果在初始化時,需要指向堆中的字串,就必須在堆中先為字串分配空間。

定義二重指標char **p,*p代表指向字串的指標。

p指向的是指標的位址,而非字母的位址,可認為p指向了乙個指標陣列;這個指標陣列並非儲存在**塊的常量,所以需要在堆中為指標陣列分配空間。假設需要m個字串,就要為p分配m*sizeof(char *)的空間。

二重指標p的示意圖如下所示。

p指向指標陣列首位址,*p指向字串位址,**p指向字串首元素。

關於二重指標的**如下所示:

#include #include int main(void)

; char * s2;

p = malloc(2);

s2 = "abcdefgh";

*p = s1;

p[1] = s2;

printf("s0:%s\n", p[0]);

printf("s1:%s\n", p[1]);

free(p);

}

p指向的指標陣列分別指向字串s1的首位址,和s2的首位址。

函式可執行,輸出如下:

s:12345

s:abcdefgh

說明二重字串陣列需要在堆中分配空間。

是否為字串指標分配空間,依據為字串指標指向的資料是否為堆中的資料。

1,一重指標如果指向字串常量,則不需要為字串常量分配空間;

2,一重指標如果指向需在堆中分配的字串,比如一重指標為strcpy的目標位址,則需要為指標在堆中分配空間;

3,而二重指標始終指向字串指標陣列,不可能為儲存在**塊的常量,所以必須為二重字串指標在堆中分配空間。

指標 字串去重

描述 去掉字串中重複的字串。補充完成如下程式 include int main 以下補充 輸入輸入一串字元,不超過1023個。只有英文小寫字元。輸出輸出不重複的字元。字元按照第一次出現的順序輸出。樣例輸入 abacadbb 樣例輸出 abcd include intmain char dedupli...

鍊錶為什麼有些情況下要使用二重指標

但為啥執行結果天差地別呢?分析 第二種情況用list接收乙個返回值,這是一定能成功的,在函式中malloc了乙個node空間,然後將其位址返回,如此list的值就等於這個node的位址了 第一種情況是將list作為引數傳入,我們知道,一旦涉及引數,就會有形參和實參,也就是說會有乙個list的副本。這...

為什麼字串可以賦值給字元指標變數

2.指標可以自增,而陣列不能自增 指標是位址變數,而陣列是位址常量 3.void指標不能進行指標運算,也不能進行 取值操作 所指向的物件型別不確定 5.字元常量的型別可以理解為字元常量陣列的型別。例如 abcd 的型別可以看成 const char 5 6.陣列的型別是由該陣列所存放的元素的型別和陣...