指標傳參及分配空間

來源:互聯網
上載者:User
#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)是分配後連續空間的首地址。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.