內存四區

1.代碼區:
代碼區Code,程序被操作系統加載到內存的時候,所有的可執行代碼都加載到代碼區,也叫代碼段,這塊內存是不可以在運行期間修改的。

2.?靜態區

所有的全局變量以及程序中的靜態變量都存儲在靜態區。

#include<stdio>
int c = 0;//靜態區
void test(int a,int b)
{printf(“%d %d\n”,&a,&b); //在棧區
}
int main()
{static int d = 0;int a = 0; //棧區int b = 0;printf(“%d %d %d %d %d\n”,&a,&b,&c,main,d);return 0;
}

3.堆區

對于一個32位操作系統,最大管理4G內存,其中1G是給操作系統自己用的,剩下的3G都是給用戶程序,一個用戶程序理論上可以使用3G空間

int *p = (int*)malloc(sizeof(int) * 10); //在堆中申請內存,在堆中申請了一個10個int型大小內存。
char *p1 = mallocsizeof(char) * 10); //在隊中申請10個char這么大的空間free(p);//釋放通過malloc分配的堆內存
free(p1); //釋放通過maclloc分配的對內存

4.棧區

棧stack是一種先進后出的內存結構,所有的自動變量,函數的形參都是由編譯器自動放出棧中,當一個自動變量超出其作用域時,自動從棧中彈出。

對于自動變量,什么時候入棧,什么時候出棧,是不需要程序控制的,由C語言編譯器實現的。

#include<stdio.h>
int *geta() //函數的返回值是個指針
{auto int a = 100;return &a;
}//int a的作用域就是{}
int main()
{int *p = geta();//這里得到的是一個臨時變量的地址,這個地址在函數geta調用結束以后已經無效了*p = 100;printf(“%d\n”,*p);return 0;
}

?????? 棧不會很大,一般都是K為單位

?????? 棧溢出:當棧空間已滿,但還往棧內存壓變量,這個就叫棧溢出。

int *geta() //錯誤,不能將一個棧變量的地址通過函數的返回值返回
{int a = 0;return &a;
}int *geta1() //通過函數的返回值可以返回一個對地址,但記得一定要free
{int *p = malloc(sizeof(int));return p;
}
int main()
{int *getp = geta1();*getp = 100;free(getp);
}
int *geta2() //合法
{static int a = 100;return &a;
}
int main()
{int *getp = geta2();*getp = 100;//free(getp);
}

?

int main() //結果正常。
{int *p = NULL;p = malloc(sizeof(int) * 10);p[0] = 1;p[1] = 2;printf(“p[0] = %d, p[1] = %d\n”,p[0],p[1]); //
    free(p);
}

?

//結果崩潰
void getheap(int *p)
{p = malloc(sizeof(int) * 10);
}
int main()
{int *p = NULL;getheap(p);p[0] = 1;p[1] = 2;printf(“p[0] = %d, p[1] = %d\n”,p[0],p[1]); //
    free(p);
}

分析:主函數的p的值NULL ,傳遞給函數getheap中的*p,在函數中malloc分配的內存分配給了函數中的*p,分配的malloc是堆中的,mian中的內存都在棧中的,意味這main函數中的p沒有得到內存地址。

?

修正:

void getheap(int **p)
{*p = (int*)malloc(sizeof(int) * 10);
}
int main()
{int *p = NULL;getheap(&p);p[0] = 1;p[1] = 2;printf(“p[0] = %d, p[1] = %d\n”,p[0],p[1]); //
    free(p);
}

這樣就可以給指針p分配內存了。

?

轉載于:https://www.cnblogs.com/wanghao-boke/p/11074687.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385017.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385017.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385017.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

最高效的進(線)程間通信機制--eventfd

我們常用的進程&#xff08;線程&#xff09;間通信機制有管道&#xff0c;信號&#xff0c;消息隊列&#xff0c;信號量&#xff0c;共享內存&#xff0c;socket等等&#xff0c;其中主要作為進程&#xff08;線程&#xff09;間通知/等待的有管道pipe和socketpair。線程還有特…

malloc,calloc,realloc

與堆操作相關的兩個函數 malloc #include<stdio.h> #include<stdlib.h> #include<string.h>int main() {char *p malloc(10); //內存隨機&#xff0c;未做處理int i;for(i 0; i < 10: i){printf(“%d “,p[i]);} free(p);return 0; } 運行結果&…

Linux內核同步機制之completion

內核編程中常見的一種模式是&#xff0c;在當前線程之外初始化某個活動&#xff0c;然后等待該活動的結束。這個活動可能是&#xff0c;創建一個新的內核線程或者新的用戶空間進程、對一個已有進程的某個請求&#xff0c;或者某種類型的硬件動作&#xff0c;等等。在這種情況下…

可變參數函數(一)

一個函數可以接受不定數的參數個數&#xff0c;這就是可變參數函數&#xff0c;比較常見的比如printf(),scanf()&#xff1b; printf(const char* format,…); printf(“%d”,i); printf(“%s”,s); printf(“the number is %d,stirng is :%s”,i,s); 變量參數函數的簡單實現&a…

Linux內核線程kernel thread詳解--Linux進程的管理與調度

內核線程為什么需要內核線程Linux內核可以看作一個服務進程(管理軟硬件資源&#xff0c;響應用戶進程的種種合理以及不合理的請求)。 內核需要多個執行流并行&#xff0c;為了防止可能的阻塞&#xff0c;支持多線程是必要的。 內核線程就是內核的分身&#xff0c;一個分身可以處…

可變參數函數(二)

函數樣例&#xff1a; #include<stdio.h> #include<stdlib.h> #include<stdarg.h>double add(int n,...) {int i 0;double sum 0;va_list argptr;va_start(argptr,n);for(i 0 ; i < n; i){double d va_arg(argptr,double);printf("%d argument …

Linux 內核網絡協議棧 ------sk_buff 結構體 以及 完全解釋 (2.6.16)

在2.6.24之后這個結構體有了較大的變化&#xff0c;此處先說一說2.6.16版本的sk_buff&#xff0c;以及解釋一些問題。一、先直觀的看一下這個結構體~~~~~~~~~~~~~~~~~~~~~~在下面解釋每個字段的意義~~~~~~~~~~~[cpp] view plaincopyprint?struct sk_buff { /* These…

可變參數輸出(三)

Linux C關于輸出函數的定義&#xff1a; int printf(const char *format,…); int vprintf(const char * format,va_list ap); int vfprintf(FILE *stream,cosnt char *format,va_list ap); int vsprintf(char *str,const char *format,va_list ap); int vsnprintf(char *str,s…

最常用的設計模式---適配器模式(C++實現)

適配器模式屬于結構型的設計模式&#xff0c;它是結構型設計模式之首&#xff08;用的最多的結構型設計模式&#xff09;。 適配器設計模式也并不復雜&#xff0c;適配器它是主要作用是將一個類的接口轉換成客戶希望的另外一個接口這樣使得原本由于接口不兼容而不能一起工作的那…

Linux 簡單打印日志(二)

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> //#include<windows.h> #include <unistd.h> // linux下頭文件#define FILE_MAX_SIZE (1024*1024)void get_local_time(char* buffer){time_t rawtime;struct …

程序隨筆——C++實現的一個線程池

1.線程池簡介 我們知道在線程池是一種多線程處理形式&#xff0c;處理過程中我們將相應的任務提交給線程池&#xff0c;線程池會分配對應的工作線程執行任務或存放在任務隊列中&#xff0c;等待執行。 面向對象編程中&#xff0c;創建和銷毀對象是需要消耗一定時間的&#xff0…

線程池原理及創建并C++實現

本文給出了一個通用的線程池框架&#xff0c;該框架將與線程執行相關的任務進行了高層次的抽象&#xff0c;使之與具體的執行任務無關。另外該線程池具有動態伸縮性&#xff0c;它能根據執行任務的輕重自動調整線程池中線程的數量。文章的最后&#xff0c;我們給出一個簡單示例…

Linux 打印簡單日志(一)

簡單日志輸出&#xff1a; #include<stdio.h> #include<string.h> #include<stdlib.h>void write(char* filename,char* szStr){FILE* fp;fp fopen(filename,"at");if(fp ! NULL){fwrite(szStr,256,1,fp); //fclose(fp);fp NULL;} }int main(int…

c++簡單線程池實現

線程池&#xff0c;簡單來說就是有一堆已經創建好的線程&#xff08;最大數目一定&#xff09;&#xff0c;初始時他們都處于空閑狀態&#xff0c;當有新的任務進來&#xff0c;從線程池中取出一個空閑的線程處理任務&#xff0c;然后當任務處理完成之后&#xff0c;該線程被重…

Linux 打印可變參數日志

實現了傳輸進去的字符串所在的文檔&#xff0c;函數和行數顯示功能。 實現了將傳入的可變參數打印到日志功能。 #include<stdio.h> #include<stdarg.h> #include<string.h>const char * g_path "/home/exbot/wangqinghe/log.txt"; #define LOG(fm…

C++強化之路之線程池開發整體框架(二)

一.線程池開發框架 我所開發的線程池由以下幾部分組成&#xff1a; 1.工作中的線程。也就是線程池中的線程&#xff0c;主要是執行分發來的task。 2.管理線程池的監督線程。這個線程的創建獨立于線程池的創建&#xff0c;按照既定的管理方法進行管理線程池中的所有線程&#xf…

vfprintf()函數

函數聲明&#xff1a;int vfprintf(FILE *stream, const char *format, va_list arg) 函數參數&#xff1a; stream—這是指向了FILE對象的指針&#xff0c;該FILE對象標識了流。 format—c語言字符串&#xff0c;包含了要被寫入到流stream中的文本。它可以包含嵌入的format標簽…

Makefile(二)

將生產的.o文件放進指定的文件中&#xff08;先創建該文件夾&#xff09; src $(wildcard ./*.cpp) obj $(patsubst %.cpp,./output/%.o,$(src))target test$(target) : $(obj)g $(obj) -o $(target) %.o: %.cppg -c $< -o output/$.PHONY:clean clean:rm -f $(target) $…

TCP粘包問題分析和解決(全)

TCP通信粘包問題分析和解決&#xff08;全&#xff09;在socket網絡程序中&#xff0c;TCP和UDP分別是面向連接和非面向連接的。因此TCP的socket編程&#xff0c;收發兩端&#xff08;客戶端和服務器端&#xff09;都要有成對的socket&#xff0c;因此&#xff0c;發送端為了將…

UML類圖符號 各種關系說明以及舉例

UML中描述對象和類之間相互關系的方式包括&#xff1a;依賴&#xff0c;關聯&#xff0c;聚合&#xff0c;組合&#xff0c;泛化&#xff0c;實現等。表示關系的強弱&#xff1a;組合>聚合>關聯>依賴 相互間關系 聚合是表明對象之間的整體與部分關系的關聯&#xff0c…