#include <stdlib.h>#include <stdio.h>#include <string.h>#include <iostream>using namespace std;void GetCharMemory(char **p, int num){ *p = (char*)malloc(sizeof(char) * num);}int main(void){ char *str = NULL; GetCharMemory(&str, 100); strcpy(str, "hello"); cout<<str<<endl; free(str);}依次分析:
第一句 char *str = NULL; 定義字元指標str ,且str自身地址為:0x7fffffffe1d8,值為0x0。
(gdb) p &str$1 = (char **) 0x7fffffffe1d8(gdb) p str$2 = 0x0
第二句 GetCharMemory(&str, 100); 將指標的地址和分配空間的大小傳進去。
然後進入方法 GetCharMemory 中,此時形參char **p本身的地址為:0x7fffffffe1b8,p 的值等於傳進來str的地址0x7fffffffe1d8,即p指向str。
p所指向的地址0x7fffffffe1d8的值即*p也是指標str的值仍為0x0。
(gdb) p &p$3 = (char ***) 0x7fffffffe1b8(gdb) p p$4 = (char **) 0x7fffffffe1d8(gdb) p *p$5 = 0x0
然後這句 *p = (char*)malloc(sizeof(char) * num); 是給p所指向的str分配值。這個值是一塊100個char類型大小的連續空間的首地址。再看此時*p的值:
(gdb) p *p$6 = 0x602010 ""
分配空間後接下來給str指向的空間賦值 strcpy(str, "hello");,此時再看該地址的值:
(gdb) p &str$7 = (char **) 0x7fffffffe1d8(gdb) p str $8 = 0x602010 "hello"(gdb) p str+1$9 = 0x602011 "ello"
上面可以看出指標str的值等於 GetCharMemory 方法分配的值,並且在str所指向地址(即str的值)對應的空間可以寫入資料,同時該地址(0x602010)是分配後連續空間的首地址。