中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
程序分區(qū)模型(代碼實例解析)

有沒有那么一首歌

分區(qū)模型

棧區(qū)

由系統(tǒng)進行內(nèi)存的管理。主要存放函數(shù)的參數(shù)以及局部變量。在函數(shù)完成執(zhí)行,系統(tǒng)自行釋放棧區(qū)內(nèi)存,不需要用戶管理。

代碼示例:

char* func(){
char p[] = "hello world!"; //在棧區(qū)存儲 亂碼
printf("%s\n", p);
return p;
}
void test(){
char* p = NULL;
p = func();  
printf("%s\n",p); 
}

結(jié)果第一次可以輸出,第二次輸出亂碼

堆區(qū)

由編程人員手動申請,手動釋放,若不手動釋放,程序結(jié)束后由系統(tǒng)回收,生命周期是整個程序運行期間。使用malloc或者new進行堆的申請。

代碼示例:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>

using namespace std;

char* func() {
char* str = (char*)malloc(100);
strcpy(str, "hello world!");
printf("%s\n", str);
return str;
}

void test01() {
char* p = NULL;
p = func();
printf("%s\n", p);
}

void allocateSpace(char* p) {
p = (char*)malloc(100);
strcpy(p, "hello world!");
printf("%s\n", p);
}

void test02() {

char* p = NULL;
allocateSpace(p);

printf("%s\n", p);
}

int main()
{
test01();
test02();
}


堆分配內(nèi)存API:

calloc

#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);
  • 功能:
    在內(nèi)存動態(tài)存儲區(qū)中分配nmemb塊長度為size字節(jié)的連續(xù)區(qū)域。calloc自動將分配的內(nèi)存 置0。
  • 參數(shù):
    nmemb:所需內(nèi)存單元數(shù)量
    size:每個內(nèi)存單元的大小(單位:字節(jié))
  • 返回值:
    成功:分配空間的起始地址
    失敗:NULL

realloc

#include <stdlib.h>
void *realloc(void *ptr, size_t size);

  • 功能:
    重新分配用malloc或者calloc函數(shù)在堆中分配內(nèi)存空間的大小。
    realloc不會自動清理增加的內(nèi)存,需要手動清理,如果指定的地址后面有連續(xù)的空間,那么就會在已有地址基礎(chǔ)上增加內(nèi)存,如果指定的地址后面沒有空間,那么realloc會重新分配新的連續(xù)內(nèi)存,把舊內(nèi)存的值拷貝到新內(nèi)存,同時釋放舊內(nèi)存。
  • 參數(shù):
    ptr:為之前用malloc或者calloc分配的內(nèi)存地址,如果此參數(shù)等于NULL,那么和realloc與malloc功能一致
    size:為重新分配內(nèi)存的大小, 單位:字節(jié)
  • 返回值:
    成功:新分配的堆內(nèi)存地址
    失敗:NULL

示例代碼:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void test01() {

int* p1 = (int *)calloc(10, sizeof(int));
if (p1 == NULL) {
return;
}
for (int i = 0; i < 10; i++) {
p1[i] = i + 1;
}
for (int i = 0; i < 10; i++) {
printf("%d ", p1[i]);
}
printf("\n");
free(p1);
}

void test02() {
int* p1 = (int *)calloc(10, sizeof(int));
if (p1 == NULL) {
return;
}
for (int i = 0; i < 10; i++) {
p1[i] = i + 1;
}

int* p2 = (int *)realloc(p1, 15 * sizeof(int));
if (p2 == NULL) {
return;
}

printf("P1=%d\n", p1);
printf("P2=%d\n", p2);

//打印
for (int i = 0; i < 15; i++) {
printf("%d ", p2[i]);
}
printf("\n");

//重新賦值
for (int i = 0; i < 15; i++) {
p2[i] = i + 1;
}

//再次打印
for (int i = 0; i < 15; i++) {
printf("%d ", p2[i]);
}
printf("\n");

free(p2);
}

int main()
{
test01();
test02();

return 0;
}

全局/靜態(tài)區(qū)

全局靜態(tài)區(qū)內(nèi)的變量在編譯階段已經(jīng)分配好內(nèi)存空間并初始化。

這塊內(nèi)存在程序運行期間一直存在,它主要存儲全局變量、靜態(tài)變量和常量。

例如:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int v1 = 10;//全局/靜態(tài)區(qū)
const int v2 = 20;//常量,一旦初始化,不可修改
static int v3 = 20; //全局/靜態(tài)區(qū)
char *p1;//全局/靜態(tài)區(qū),編譯器默認初始化為NULL

void test() {
static int v4 = 20; //全局/靜態(tài)區(qū)
}
int main()
{
test();
return 0;
}

注意:

  1. 這里不區(qū)分初始化和未初始化的數(shù)據(jù)區(qū),是因為靜態(tài)存儲區(qū)內(nèi)的變量若不顯示初始化,則編譯器會自動以默認的方式進行初始化,即靜態(tài)存儲區(qū)內(nèi)不存在未初始化的變量。
  2. 全局靜態(tài)存儲區(qū)內(nèi)的常量分為常變量和字符串常量,一經(jīng)初始化,不可修改。靜態(tài)存儲內(nèi)的常變量是全局變量,與局部常變量不同,區(qū)別在于局部常變量存放于棧,實際可間接通過指針或者引用進行修改,而全局常變量存放于靜態(tài)常量區(qū)則不可以間接修改。
  3. 字符串常量存儲在全局/靜態(tài)存儲區(qū)的常量區(qū)。

關(guān)于靜態(tài)全局變量與非靜態(tài)全局變量的討論:

關(guān)于靜態(tài)全局變量與非靜態(tài)全局變量的討論,內(nèi)容過多,大家可以看下面一篇文章:
https://yangyongli.blog.csdn.net/article/details/120402589

靜態(tài)全局變量與非靜態(tài)全局變量的使用說明

1.若全局變量僅在單個C文件中訪問,則可以將這個變量修改為靜態(tài)全局變量,以降低模塊間的耦合度;

2.若全局變量僅由單個函數(shù)訪問,則可以將這個變量改為該函數(shù)的靜態(tài)局部變量,以降低模塊間的耦合度;

3.設(shè)計和使用訪問動態(tài)全局變量、靜態(tài)全局變量、靜態(tài)局部變量的函數(shù)時,需要考慮重入問題,因為他們都放在靜態(tài)數(shù)據(jù)存儲區(qū),全局可見;

4.如果我們需要一個可重入的函數(shù),那么,我們一定要避免函數(shù)中使用static變量(這樣的函數(shù)被稱為:帶“內(nèi)部存儲器”功能的的函數(shù))

5.函數(shù)中必須要使用static變量情況:比如當某函數(shù)的返回值為指針類型時,則必須是static的局部變量的地址作為返回值,若為auto類型,則返回為錯指針。

代碼示例:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char* func() {
static char arr[] = "hello world!"; //在靜態(tài)區(qū)存儲 可讀可寫
arr[2] = 'c';
const char* p = "hello world!"; //全局/靜態(tài)區(qū)-字符串常量區(qū) 
//p[2] = 'c'; //只讀,不可修改 
printf("%d\n", arr);
printf("%d\n", p);
printf("%s\n", arr);
return arr;
}
void test() {
char* p = func();
printf("%s\n", p);
}

int main()
{
test();

return 0;
}

總結(jié)

數(shù)據(jù)區(qū)包括:堆,棧,全局/靜態(tài)存儲區(qū)。
全局/靜態(tài)存儲區(qū)包括:常量區(qū),全局區(qū)、靜態(tài)區(qū)。
常量區(qū)包括:字符串常量區(qū)、常變量區(qū)。

代碼區(qū):存放程序編譯后的二進制代碼,不可尋址區(qū)。

可以說,C/C++內(nèi)存分區(qū)其實只有兩個,即代碼區(qū)和數(shù)據(jù)區(qū)。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
10W 字C語言硬核總結(jié)(一),值得閱讀收藏!
由淺入深,帶你探索C語言指針的魅力
精心整理的C語言面試題目
char * 和 char [] 有什么區(qū)別
C|程序塊結(jié)構(gòu)和變量的存儲類型
C語言程序里全局變量、局部變量、堆、棧的存儲區(qū)域
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服