欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存

 更新時(shí)間:2016年12月22日 09:40:54   投稿:jingxian  
下面小編就為大家?guī)硪黄獪\談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

1、有以下題目:

#include <iostream>
using namespace std;

void GetMemeory(char* p)
{
  p=(char*)malloc(sizeof(char)*100);
}

int main()
{
  char *str=NULL;
  GetMemeory(str);
  strcpy(str,"Thunder");
  strcat(str,"Downloader");
  printf(str);
  system("pause");
  return 0;
}

我們期望的輸出是:ThunderDownloader

然而當(dāng)我們運(yùn)行此段代碼的時(shí)候發(fā)現(xiàn),程序崩潰了。

其實(shí)我們深入分析下不難發(fā)現(xiàn),當(dāng)我們傳入str到GetMemeory()函數(shù)中的時(shí)候,該函數(shù)我們創(chuàng)建了一個(gè)臨時(shí)

的指針變量片p,然后將其指向NULL。然后我們?yōu)榕R時(shí)指針變量p動(dòng)態(tài)分配內(nèi)存,注意,當(dāng)我們在返回的時(shí)候

整個(gè)臨時(shí)指針變量是釋放掉的,因?yàn)槠鋬?nèi)存是在棧內(nèi)存中分配的。但是我們之前傳入的str的內(nèi)存地址與臨時(shí)變量

的內(nèi)存地址是不相同的。所以此時(shí)str不能獲取在函數(shù)GetMemmory分配的內(nèi)存,因此后面的字符串復(fù)制和鏈接操作

都將造成程序崩潰。

我們可以用下面的圖形更加生動(dòng)的這一過程:

:

假設(shè)str本身內(nèi)存為0x123 臨時(shí)指針變量p的內(nèi)存為0x456 動(dòng)態(tài)分配的內(nèi)存起始地址為0x789

當(dāng)GetMemory函數(shù)結(jié)束的時(shí)候p被釋放,而再也無指針指向這塊動(dòng)態(tài)分配的內(nèi)存了。另外str也不可能

獲取這段動(dòng)態(tài)分配的內(nèi)存的地址。所以也造成了內(nèi)存泄露。

我們可以用如下兩種方法解決這一問題:

一種是二級指針:

#include <iostream>
using namespace std;

void GetMemeory(char** p)
{
  (*p)=(char*)malloc(sizeof(char)*100);
}

int main()
{
  char *str=NULL;
  GetMemeory(&str);
  strcpy(str,"Thunder");
  strcat(str,"Downloader");
  printf(str);
  system("pause");
  return 0;
}

運(yùn)行截圖為:

關(guān)于二級指針的方法可以參考如下的流程圖:

一種是指針的引用方法:

#include <iostream>
using namespace std;

void GetMemeory(char*& p)
{
  p=(char*)malloc(sizeof(char)*100);
}

int main()
{
  char *str=NULL;
  GetMemeory(str);
  strcpy(str,"Thunder");
  strcat(str,"Downloader");
  printf(str);
  system("pause");
  return 0;
}

運(yùn)行截圖:

關(guān)于指針引用方法的流程圖如下:

能力有限,難免有沒說清楚的地方,還望包涵。

以上就是小編為大家?guī)淼臏\談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存全部內(nèi)容了,希望大家多多支持腳本之家~

相關(guān)文章

  • c語言conio.h基本知識點(diǎn)總結(jié)

    c語言conio.h基本知識點(diǎn)總結(jié)

    在本篇文章里小編給大家分享的是關(guān)于c語言conio.h是什么意思的相關(guān)知識點(diǎn),需要的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • 基于OpenCV自定義色條實(shí)現(xiàn)灰度圖上色功能代碼

    基于OpenCV自定義色條實(shí)現(xiàn)灰度圖上色功能代碼

    今天通過本文給大家分享基于OpenCV自定義色條實(shí)現(xiàn)灰度圖上色功能代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • C語言數(shù)組和指針的問題一道非常值得深思的筆試題

    C語言數(shù)組和指針的問題一道非常值得深思的筆試題

    今天小編就為大家分享一篇關(guān)于C語言數(shù)組和指針的問題一道非常值得深思的筆試題,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言關(guān)于二叉樹中堆的創(chuàng)建和使用整理

    C語言關(guān)于二叉樹中堆的創(chuàng)建和使用整理

    大家好,這里是針對二叉樹中堆結(jié)構(gòu)的順序儲存,整理出來一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們在評論區(qū)指出,我們相互學(xué)習(xí),共同進(jìn)步
    2022-08-08
  • C++中套接字庫sockpp的使用詳解

    C++中套接字庫sockpp的使用詳解

    sockpp是一個(gè)開源、簡單、現(xiàn)代的C++套接字庫,這篇文章主要為大家詳細(xì)介紹一下套接字庫sockpp的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下
    2023-11-11
  • 對C語言中指針的理解與其基礎(chǔ)使用實(shí)例

    對C語言中指針的理解與其基礎(chǔ)使用實(shí)例

    這篇文章主要介紹了對C語言中指針的理解與其基礎(chǔ)使用實(shí)例,文中援引了知乎熱門問題"為什么說指針是 C 語言的精髓?"中的精彩回答,需要的朋友可以參考下
    2016-03-03
  • Sersync+Rsync實(shí)現(xiàn)觸發(fā)式文件同步實(shí)戰(zhàn)過程

    Sersync+Rsync實(shí)現(xiàn)觸發(fā)式文件同步實(shí)戰(zhàn)過程

    sersync是使用c++編寫,而且對linux系統(tǒng)文 件系統(tǒng)產(chǎn)生的臨時(shí)文件和重復(fù)的文件操作進(jìn)行過濾。下面通過本文給大家分享Sersync+Rsync實(shí)現(xiàn)觸發(fā)式文件同步實(shí)戰(zhàn)過程,需要的朋友參考下吧
    2017-09-09
  • Qt物聯(lián)網(wǎng)管理平臺之實(shí)現(xiàn)告警短信轉(zhuǎn)發(fā)

    Qt物聯(lián)網(wǎng)管理平臺之實(shí)現(xiàn)告警短信轉(zhuǎn)發(fā)

    系統(tǒng)在運(yùn)行過程中,會(huì)實(shí)時(shí)采集設(shè)備的數(shù)據(jù),當(dāng)采集到的數(shù)據(jù)發(fā)生報(bào)警后,可以將報(bào)警信息以短信的形式發(fā)送給指定的管理員。本文將利用Qt實(shí)現(xiàn)告警短信轉(zhuǎn)發(fā),感興趣的可以嘗試一下
    2022-07-07
  • C++?OpenCV實(shí)戰(zhàn)之零部件的自動(dòng)光學(xué)檢測

    C++?OpenCV實(shí)戰(zhàn)之零部件的自動(dòng)光學(xué)檢測

    這篇文章主要為大家介紹一個(gè)C++?OpenCV的實(shí)戰(zhàn)——零部件的自動(dòng)光學(xué)檢測,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-09-09
  • C語言的基本語法詳解

    C語言的基本語法詳解

    本篇文章主要講解C語言 基本語法,這里提供簡單的示例和代碼來詳細(xì)講解C語言的基本語法,開始學(xué)習(xí)C語言的朋友可以看一下,希望能夠給你帶來幫助
    2021-09-09

最新評論