C/C++指针错误与调试相关学习总结
生活随笔
收集整理的這篇文章主要介紹了
C/C++指针错误与调试相关学习总结
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
使用VS2010調(diào)試技巧讓C指針無處遁形
http://blog.csdn.net/21aspnet/article/details/6723758 ?Linux 下調(diào)試遠沒有windows下的VS方便,不管是VC++6還是VS2003,2005,2008,2010,2012.
VS2012自動格式化代碼 Ctrl+K+D
VS下調(diào)試一定要注意盡量不要用F11,要用F10!不然需要引入庫文件,提示的警告信息可以“忽略”即可
所以我覺得不妨用VS調(diào)試程序,可以用VS來研究C語言似乎是一個比較不錯的主意,當(dāng)你的C已經(jīng)很好的時候可以直接在linux下去手寫代碼了。
當(dāng)然windows下寫的C程序放到Linux下運行,也是可以的,不過需要知道的是有些語法Windows下支持但是Linux下是不支持。
還有時會有亂碼,需要注意!注意!
其實微軟是希望用C++的,所以默認(rèn)VS2010是用來開發(fā)C++的。準(zhǔn)確的說是VC++。
?
首先裝好VS2012.
新建一個VC++的 win32控制臺項目:
?
然后“歡迎使用 Win32 應(yīng)用程序向?qū)А毕乱徊?#xff0c;需要注意的是附加類型勾上“空項目”,再完成
?
系統(tǒng)自動生成解決方案文件夾,在右側(cè)“解決方案”中的“源文件”中新建文件即可。
?
彈出的窗口默認(rèn)選中的是C++的cpp文件,你只要將文件名改為.c即可,也可以點左邊“代碼”菜單篩選下。
?
自己寫代碼:
#include <stdio.h> ?
main() ?
{ ?
? ? int a=1; ?
? ? int * b=&a; ?
? ? printf("%d",b); ???
} ?
然后在printf處設(shè)置斷點。
?
按F5啟動調(diào)式。
在“監(jiān)視”窗口,你可以自己添加需要監(jiān)視的元素,很清晰的看到內(nèi)存的值在右側(cè)。
也可以使用 命令和即時窗口 有興趣可以自己研究。
?
再來看看字符串指針:
#include <stdio.h> ?
main() ?
{ ?
? ? //int a=1; ?
? ? //int * b=&a; ?
? ? char * c="abcama1w"; ?
? ? char *d=c; ?
? ? printf("%s",d); ???
} ?
是不是很清晰。
再看數(shù)組
#include <stdio.h> ?
main() ?
{ ?
? ? //int a=1; ?
? ? //int * b=&a; ?
? ? char c[12]="abcama1w"; ?
? ? char *d=c; ?
? ? printf("%s",d); ???
} ?
下面這張圖更清晰的反映數(shù)組和指針的關(guān)系
再看看d
========
C語言指針錯誤的分析及調(diào)試
全文見此http://www.c-s-a.org.cn/ch/reader/view_abstract.aspx?file_no=20130336
摘要
C語言指針的有些錯誤在程序編譯階段難以發(fā)現(xiàn),分析了帶有此類錯誤的示例程序,并在VC6.0進行調(diào)試,展示此類指針錯誤的錯誤現(xiàn)象,分析其產(chǎn)生的原因;
2指針錯誤的分析及調(diào)試
2.1 指針在使用前未初始化
VC編譯時產(chǎn)生警告C4700,應(yīng)檢查指針是否初始化;
2.2 指針指向的內(nèi)存已經(jīng)釋放
2.3 指針指向的地址越界
========
C語言指針的運用及常見錯誤
全文https://wenku.baidu.com/view/341895c56529647d27285267.html
*和[]在定義時只是說明作用,不能誤解為運算符
指針變量未初始化
指針類型錯誤
用整數(shù)值直接給指針賦值
指針偏移
指針之間相互賦值
========
C語言 運行后出現(xiàn)亂碼的結(jié)果,調(diào)試中發(fā)現(xiàn)提示錯誤的指針
#include "stdafx.h" #include<string> char *concat(const char *s1,const char *s2) { char *result; result=(char *)malloc(strlen(s1)+strlen(s2)+1); if(result==NULL){ printf("error:malloc faineled in concat\n"); exit(EXIT... 展開if(result==NULL)
{
? ? printf("error:malloc faineled in concat\n");
? ? exit(EXIT_FAILURE);
} ?
strcpy(result,s1);
strcat(result,s2);
少頭文件#include<stdlib.h>,中間這么改
========
C語言調(diào)試時文件指針FILE *fp出錯
這段調(diào)試時出錯。。 printf("您選擇的是:編號\n請選擇您要查詢的編號:\n"); scanf("%s",bianhao); while(1) { FILE *fp1=fopen("my.dat","r"); if(fgets(buff,1024,fp1)==NULL) break; if(strcmp(&buff[0],bianhao)==0) ... 展開printf("您選擇的是:編號\n請選擇您要查詢的編號:\n");
scanf("%s",bianhao);
?//本來你的程序是這樣的 ? ?
FILE *fp1=fopen("my.dat","r");//文件只能打開一次 不能重復(fù)打開
?while(1)
{
?if(fgets(buff,1024,fp1)==NULL)
? break;
?if(strcmp(buff,bianhao)==0)//這里比較字符串不用取地址
? printf("%s",buff);
}
fclose(fp1);
//不過你的要求是 {第一個字符 等于輸入的值 ?}那應(yīng)該是這樣 ? ??
printf("您選擇的是:編號\n請選擇您要查詢的編號:\n");
scanf("%c",bianhao);//這里的bianhao是char 不是 char[]
FILE *fp1=fopen("my.dat","r");
?while(1)
{
? ? if(fgets(buff,1024,fp1)==NULL)
? break;
?if(buff[0] == bianhao)
? printf("%s",buff);
}
fclose(fp1);
//但是這樣顯然不符合邏輯 編號應(yīng)該是多個字符 所以也可能是這樣
printf("您選擇的是:編號\n請選擇您要查詢的編號:\n");
scanf("%s",bianhao);//依然輸入 char[]
FILE *fp1=fopen("my.dat","r");
?while(1)
{
? ? if(fgets(buff,1024,fp1)==NULL)
? break;
?if(strncmp(buff,bianhao, strlen(bianhao))==0)//這里的函數(shù)改成strncmp 具體意思去百度
? printf("%s",buff);
}
fclose(fp1);
?
FILE *fp1=fopen("my.dat","r");
主要是這里的問題... 改成絕對路徑就沒事了.. 但是我想要相對于程序的路徑 該怎么改?
追答
什么意思 程序相對的路徑 你指的是exe運行目錄 或者 exe的上一個目錄么
./表示 exe目錄 ../表示exe上一個
注意exe在哪里。。
========
c語言如何能快速調(diào)試判斷出程序在哪里出現(xiàn)了指針錯誤而中斷
在程序很復(fù)雜的情況下看出錯時候的堆棧調(diào)用情況
或者
OD載入看異常斷點
========
C++程序設(shè)計之指針與調(diào)試
本人學(xué)習(xí)C++的過程經(jīng)驗及總結(jié),本文內(nèi)容:調(diào)試與動態(tài)內(nèi)存分配
工具/原料
vs2015
C中的內(nèi)存管理?
1
C語言提供了一些內(nèi)存管理函數(shù),這些內(nèi)存管理函數(shù)可以按需要動態(tài)地分配內(nèi)存空間,也可把不再使用的空間回收待用,為有效地利用內(nèi)存資源提供了手段。
malloc
calloc
free
realloc
2
malloc,在內(nèi)存的動態(tài)存儲區(qū)中分配一塊長度為“size”字節(jié)的連續(xù)區(qū)域。
函數(shù)原型
? ? (類型說明符*) malloc (size)?
3
使用malloc函數(shù)需要注意。
1、內(nèi)存分配函數(shù)向系統(tǒng)申請內(nèi)存空間,它的地址是隨機的,取決于內(nèi)存占用的狀態(tài)。
2、函數(shù)調(diào)用后,分配的內(nèi)存空間的內(nèi)容并不初始化,因此它的取值是無法確定的。
3、如果內(nèi)存不足,內(nèi)存分配失敗,函數(shù)返回值將是一個空指針。
4、分配的內(nèi)存空間可以認(rèn)為是各種數(shù)據(jù)類型的,也可以認(rèn)為是數(shù)組。
5、參數(shù)size一般需要借助sizeof運算符計算類型大小,也可以直接指定內(nèi)存塊的字節(jié)數(shù)。
4
calloc,在內(nèi)存動態(tài)存儲區(qū)中分配n塊長度為“size”字節(jié)的連續(xù)區(qū)域。
函數(shù)原型
? ? ? (類型說明符*)calloc(n,size)?
5
free,釋放ptr所指向的一塊內(nèi)存空間。
函數(shù)原型
? ? ? ?void free(void* ptr);?
注:ptr指向的必須是一塊用malloc或calloc分配的內(nèi)存空間。
6
realloc,當(dāng)一塊內(nèi)存大小不夠使用時,可以用realloc函數(shù)進行重新分配。
函數(shù)原型
? ? ? ?void *realloc( void *ptr, size_t size );
注:realloc改變了內(nèi)存塊的大小,但并不保證新的內(nèi)存塊和舊內(nèi)存塊是從同一個位置開始的。
END
C++中的內(nèi)存管理
1
C++動態(tài)內(nèi)存分配運算符new和delete比C語言的malloc和free函數(shù)更簡潔,語法更靈活。
new
delete
2
new,返回一個該類型的指針值,程序通過指針對這個變量進行操作。
C++程序設(shè)計之指針與調(diào)試
3
new與malloc對比。
都要指出變量的類型,類型名要放在new之后。
都可以賦初值,不是用“=初值”的方式而是用“(初值) ”的方式,
C++程序設(shè)計之指針與調(diào)試
4
可以定義為數(shù)組,加數(shù)組運算符[ ],用[ ]運算符申請的內(nèi)存稱為動態(tài)數(shù)組。
char *pc=new char[4]; ?//生成動態(tài)char 類型數(shù)組
動態(tài)變量沒有變量名,須用指針變量接收到它的地址后,通過指針運算符“*”進行操作。
*pi=a*a; ? //動態(tài)變量*pi 被賦值
5
delete,delete運算用來撤消或釋放由new生成的動態(tài)變量。
6
使用內(nèi)存管理函數(shù)時需要注意
1、釋放動態(tài)數(shù)組時,應(yīng)該在指針前加[]。
2、內(nèi)存管理函數(shù)是一一對應(yīng),new與delete對應(yīng);malloc與free對應(yīng)。
3、動態(tài)變量與一般變量的主要區(qū)別就是它可以在程序運行過程中任意被撤銷。而一般變量則必須在其所定義的程序塊結(jié)束時自動撤銷。
END
內(nèi)存區(qū)域
1
? ? ? ?在C/C++程序中,不管是局部變量,全局變量、或是動態(tài)變量,在內(nèi)存中都占用一定的空間,但是它們占用不同的空間。
? ? ? ?一個程序?qū)⒉僮飨到y(tǒng)分配給其運行的內(nèi)存分成4個區(qū)域。
C++程序設(shè)計之指針與調(diào)試
2
?代碼區(qū)
存儲程序代碼,這些代碼是一些計算機指令,它們將被送到CPU中執(zhí)行。代碼區(qū)由程序中各個函數(shù)的代碼組成。
?全局?jǐn)?shù)據(jù)區(qū)
存儲程序的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)。全局?jǐn)?shù)據(jù)區(qū)的數(shù)據(jù)在程序啟動時初始化,占用的內(nèi)存在程序結(jié)束時才釋放。
?堆區(qū)
存儲程序的動態(tài)數(shù)據(jù),包括用new和malloc等函數(shù)分配的動態(tài)內(nèi)存,它們是可以在程序運行的任何時候分配和釋放的。
?棧區(qū)
存儲程序的局部數(shù)據(jù),即各個函數(shù)內(nèi)部使用的數(shù)據(jù)。例如在函數(shù)形參和函數(shù)內(nèi)部定義的變量。函數(shù)在執(zhí)行完畢后,函數(shù)內(nèi)部使用的內(nèi)存將會被自動釋放
3
未初始化的指針
指針未初始化就進行間接引用是錯誤的。
END
常見指針錯誤
1
使用壞指針
? ? ? ?當(dāng)指針指向的內(nèi)存被釋放后,指針仍然指向那個地址,這個指針通常被稱作“壞指針”。
? ? ? ?當(dāng)動態(tài)內(nèi)存被釋放后,不能再使用指針訪問該內(nèi)存。
C++程序設(shè)計之指針與調(diào)試
2
函數(shù)返回局部變量的指針
? ?指向局部變量的指針,指向它的指針只能在函數(shù)調(diào)用期間(函數(shù)返回前)進行間接引用。
C++程序設(shè)計之指針與調(diào)試
3
空指針的間接引用
? ? 一般地,在函數(shù)開頭要對指針進行判斷。如果函數(shù)不允許空指針,那么更好的方法是使用assert增加斷言,方便程序的調(diào)試,也不影響程序的發(fā)布版本的效率。
END
內(nèi)存泄漏
1
? ? ? ?在使用動態(tài)變量時應(yīng)注意的是,要保護動態(tài)變量的地址。
? ? ? ?動態(tài)內(nèi)存地址丟失,導(dǎo)致內(nèi)存無法使用,這種問題被稱為內(nèi)存泄漏。
? ? ? ?內(nèi)存泄漏造成程序運行緩慢。動態(tài)內(nèi)存泄漏會搶占內(nèi)存資源,降低運行速度,甚至導(dǎo)致藍屏死機。
2
? ? ? 在訪問一段連續(xù)的內(nèi)存時,如果訪問了這塊連續(xù)存儲空間以外的內(nèi)存,那么就發(fā)生了內(nèi)存訪問越界。內(nèi)存訪問越界將會造成未知錯誤,極易引起程序崩潰。
? ? ? 內(nèi)存訪問越界通常發(fā)生在使用數(shù)組時。
END
Visual C++.NET調(diào)試
1
代碼編寫完成后,源代碼要被轉(zhuǎn)換為計算機可以識別的指令,每個源文件都要被編譯為中間文件,然后,所有的中間文件被鏈接稱為.exe文件。
?【生成解決方案】
讓Visual Studio.NET編譯各個源文件,并將它們鏈接成為.exe文件或其他形式的程序文件。
?【重新生成解決方案】
讓編譯器重新編譯所有源文件。
?【清理解決方案】
清除解決方案在以前生成可執(zhí)行文件時產(chǎn)生的舊文件。第一次生成解決方案時,源文件都會被編譯一次,此后再生成解決方案時,如果某個源文件沒被修改過,這個源文件將不會被重新編譯。
? ? ? ?生成一個解決方案后,會在【輸出窗口】中顯示日志,編譯中發(fā)現(xiàn)的錯誤將會被列出。雙擊包含“error”的行,可以迅速切換到出錯的代碼。編譯文件時,還可能出現(xiàn)另一種信息,即警告信息,這些警告提示了程序中潛在的錯誤。
2
斷點的使用
? ? ? 在程序代碼中某些位置設(shè)置一些斷點,令程序執(zhí)行到這些代碼時暫停,此時可以查看程序運行中變量的變化情況,以便判斷程序運行是否正常。
? ? ? ?在Visual Studio.NET中,將光標(biāo)移動到一行代碼,按“F9”鍵,即在這行設(shè)置了斷點,在代碼行上會有一個紅色圓點。還可以右擊彈出快捷菜單,選擇菜單中的【插入斷點】。
C++程序設(shè)計之指針與調(diào)試
3
單擊菜單【調(diào)試】→【啟動】運行程序后,當(dāng)程序運行到斷點行時暫停執(zhí)行。暫停執(zhí)行時,當(dāng)前代碼行用箭頭標(biāo)示。鼠標(biāo)移動到變量上時,會提示變量內(nèi)容。同時也可以借助其他工具查看內(nèi)存內(nèi)容。
C++程序設(shè)計之指針與調(diào)試
4
?【局部變量】
在代碼編輯器下邊的【局部變量】標(biāo)簽中,可以查看斷點所在函數(shù)的局部變量。這些變量的名稱、值和類型會在表格中列出。變量的值可以在表格中修改。
?【自動窗口】
【自動窗口】中可以顯示當(dāng)前代碼附近的變量的狀態(tài)。
?【監(jiān)視】
還可以使用【監(jiān)視】窗口隨時查看指定的變量。單擊表格中的空行,在名稱中輸入變量名或表達式,即可在表格中顯示這個變量的值和類型。另一種方法是選擇變量,然后按“Alt+Ctrl+Q”在彈出的對話框中添加監(jiān)視。
C++程序設(shè)計之指針與調(diào)試
5
單步執(zhí)行
使用單步命令讓程序一次只執(zhí)行一行或多行代碼
?逐語句
即每次執(zhí)行一條語句,如果遇到函數(shù),跳轉(zhuǎn)到函數(shù)內(nèi)部的語句。快捷鍵為“F11”。
?逐過程
在當(dāng)前函數(shù)內(nèi)執(zhí)行一條語句或函數(shù)(函數(shù)又稱過程),不跳轉(zhuǎn)到被調(diào)用的函數(shù)中。快捷鍵為“F10”
?跳出
讓程序繼續(xù)執(zhí)行,在當(dāng)前函數(shù)調(diào)的調(diào)用語句后的一條語句暫停執(zhí)行。
6
調(diào)用當(dāng)前函數(shù)的狀態(tài)被保存在一個叫做“調(diào)用堆棧”的數(shù)據(jù)結(jié)構(gòu)中,查看它,可以了解程序中函數(shù)的調(diào)用次序。在【調(diào)用堆棧】窗口中,可以查看函數(shù)的調(diào)用過程,也可以雙擊窗口中的函數(shù)名稱顯示對應(yīng)的函數(shù)代碼。
========
指針調(diào)試怪象分析和解決:無法查看指針指向變量的值
http://www.cjjjs.com/paper/xmkf/2016109105018607.aspx[摘要] 當(dāng)我將光標(biāo)放在指針變量上面時,沒有任何提示,不過其他局部變量是有提示的。在VS環(huán)境下,調(diào)試非常方便的,只要將光標(biāo)放在斷點處的變量上,就可以看到變量的值。此時卻沒有提示指針?biāo)赶虻闹怠?
? 最近在做TCP通信的監(jiān)控程序,也就是Socket通信。在接受到數(shù)據(jù)后,為了效率,就直接將指針傳遞給上層,然后上層邏輯就取出指針指向的內(nèi)容進行判斷分析和處理。
? ? 所有的通信命令即協(xié)議里規(guī)定的一問一答式的命令,都是使用同一個緩沖區(qū)來接受數(shù)據(jù)的。整個通信基礎(chǔ)使用的是完成端口,所有數(shù)據(jù)到來都是排隊有序的向上傳遞,所以不會遺漏數(shù)據(jù)。所以,可以使用一個緩沖區(qū)一個個的來接受和處理數(shù)據(jù)。
? ? 然而,如果出現(xiàn)了問題,那就要調(diào)試。調(diào)試的時候,將斷點打在了處理命令的位置。然而,當(dāng)運行到斷點處時,也就是收到了對應(yīng)的命令的時候,程序運行停下來了,并進入了調(diào)試狀態(tài)。然而問題來了。當(dāng)我將光標(biāo)放在指針變量上面時,沒有任何提示,不過其他局部變量是有提示的。在VS環(huán)境下,調(diào)試非常方便的,只要將光標(biāo)放在斷點處的變量上,就可以看到變量的值。此時卻沒有提示指針?biāo)赶虻闹怠?
? ? 一開始,我以為是不是VS出現(xiàn)了Bug,或者是代碼編譯的不完整,所以重新生成了解決方案好幾次,依然如此。如果說是Bug,那其他局部變量卻可以提示值,也說不過去。
========
關(guān)于指針與調(diào)試的一個小問題
寫了一個程序,按F5調(diào)試,在下面這一句停了下來。 if((ptr -> pNext == NULL) || (ptr -> pNext -> elem[0] > s) && (ptr -> elem[0] <= s)) 這一句有什么問題嗎?前面是這樣的: 在另一個函數(shù)中有: ptr = (CA *)malloc(sizeof(CA)); if(!ptr) { printf(... 展開如果ptr -> pNext = NULL;
那ptr -> pNext -> elem[0]元素在哪里呢?
最開始的時候,ptr -> pNext肯定是NULL的,所以ptr -> pNext -> elem[0]讀不到。報錯了撒~
不是在 || 的兩端只要一端為真就行嗎?難道。。。這個判斷順序不是從左到右?!!
程序在試圖讀取ptr -> pNext -> elem[0]的值的時候就已經(jīng)出錯了。。因為這塊內(nèi)存你沒有定義。。。
能先發(fā)個源碼您看看嗎?300多行
if((ptr -> pNext == NULL) || (ptr -> pNext -> elem[0] > s) && (ptr -> elem[0] <= s))
由于 && 比 || 的優(yōu)先級高
所以這句話的執(zhí)行順序是這樣的
if( ((ptr -> pNext == NULL) || (ptr -> pNext -> elem[0] > s)) && (ptr -> elem[0] <= s))
這樣,當(dāng) ptr -> pNext == NULL 成立時,再運行 ptr -> pNext -> elem[0] > s 就會產(chǎn)生錯誤
改成下面這樣就行了
if((ptr -> pNext == NULL) || ((ptr -> pNext -> elem[0] > s) && (ptr -> elem[0] <= s)) )
我覺得你說的不對,正因為 && 的優(yōu)先級比 || 高,所以要表示if((ptr -> pNext == NULL) || ? ((ptr -> pNext -> elem[0] > s) && (ptr -> elem[0] <= s)) ?) ,去掉括號效果是一樣的
編譯器會默認(rèn)將 &&左邊的所有語句 和 &&右邊的所有語句 看成是 2 個語句
不是吧高手,比如18 - 3 * 6,因為 * 的優(yōu)先級高所以先算 * 啊,&&的優(yōu)先級高,所以先算&&啊
========
s2010嘗試運行項目時出錯,無效指針
?有些人說是IntelliTrace的原因,但我這項根本就是關(guān)閉的,
兩個解決方法:
1) 打開項目屬性,選擇調(diào)試選項卡,將“啟用非托管代碼調(diào)試”一項鉤上。
2) 打開項目屬性,選擇調(diào)試選項卡,將“啟用Visual Studio宿主進程“一項鉤掉。
========
我下載VC2015 調(diào)試出現(xiàn)無效指針彈窗
cvc2015c++vc++visual studio 2015請問我下載VC2015 按F5 出現(xiàn)無效指針彈窗。
rebuild,
1>------ 已啟動全部重新生成: 項目: ConsoleApplication, 配置: Debug Win32 ------
1> main.cpp
1> ConsoleApplication.vcxproj -> D:\Documents\Visual Studio 2015\project\ConsoleApplication\Debug\ConsoleApplication.exe
========== 全部重新生成: 成功 1 個,失敗 0 個,跳過 0 個 ==========
clean
1>------ 已啟動清理: 項目: ConsoleApplication, 配置: Debug Win32 ------
========== 清理: 成功 1 個,失敗 0 個,跳過 0 個 ==========
都可以正確運行,
唯獨F5斷點調(diào)試的時候有一個
圖片說明
其他功能都沒有問題, 只有這一個, 代碼是最最簡單的。
我的系統(tǒng)是win7 64 , 求大神解救
?
工具—>調(diào)試—>常規(guī)”下,將“要求源文件與原始版本完全匹配”這一項打鉤,重新編譯。
評論 PYXFighting PYXFighting 謝謝您的回答 ,, 沒有用,, 那個勾之前就有 。。?
========
vs2013調(diào)試時彈出一個“無效指針”錯誤
代碼是沒錯的,就是vs中間安裝過一次更新,安完以后之前能調(diào)試的代碼現(xiàn)在也不能調(diào)試成功了?
新建一個沒有指針的最簡單工程試試,如果依然如此,那么應(yīng)該是更新安裝失敗了,推薦卸載VS重新裝一個。
如果新建各種工程都沒有這個問題,那么應(yīng)該是更新后代碼檢查更嚴(yán)格了吧,單步調(diào)試看看哪里的報錯。(也就是說,還是代碼問題,不是調(diào)試可以運行的代碼就一定沒有問題的)
auto scene=.....這步定義的是個指針是在函數(shù)內(nèi)部,是個局部變量,當(dāng)這個函數(shù)結(jié)束,其所指的位于棧上的內(nèi)存空間要被釋放,scene就變成無效指針了。不知指向誰。堆和棧的區(qū)別
一個由C/C++編譯的程序占用的內(nèi)存分為以下幾個部分
1、棧區(qū)(stack)— 由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其
操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
2、堆區(qū)(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回
收 。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。
3、全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的
全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另
一塊區(qū)域。 - 程序結(jié)束后由系統(tǒng)釋放。
4、文字常量區(qū) —常量字符串就是放在這里的。 程序結(jié)束后由系統(tǒng)釋放
5、程序代碼區(qū)—存放函數(shù)體的二進制代碼。
二、例子程序
這是一個前輩寫的,非常詳細(xì)
//main.cpp
int a = 0; 全局初始化區(qū)
char *p1; 全局未初始化區(qū)
main()
{
int b; 棧
char s[] = "abc"; 棧
char *p2; 棧
char *p3 = "123456"; 123456\0在常量區(qū),p3在棧上。
static int c =0; 全局(靜態(tài))初始化區(qū)
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。
strcpy(p1, "123456"); 123456\0放在常量區(qū),編譯器可能會將它與p3所指向的"123456"
優(yōu)化成一個地方。
}
這是你手打的嗎,太感謝了,不過現(xiàn)在vs連輸出helloword都會報錯,我修復(fù)下vs試試
========
關(guān)于VS打開cshtml出現(xiàn) 未能完成該操作 無效指針
第一步:關(guān)閉VS
第二部:刪除%LocalAppData%\Microsoft\VisualStudio\14.0\ComponentModelCache
第三部:重新打開
也可以試試修復(fù)VS看行不行!
========
我用vs2010的vb編程時出現(xiàn):無效指針
VS2010可選擇框架
刪除重新添加引用,bin目錄是否有DLL
我曾用vB6.0,現(xiàn)在在Vs中打入Textbox1.texe=‘‘MN’’
執(zhí)行時就彈出無效指針
========
總結(jié)
以上是生活随笔為你收集整理的C/C++指针错误与调试相关学习总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery调试学习总结
- 下一篇: VS调试js学习总结