使用c c 指標 初學者容易犯的幾個錯誤

2021-08-13 09:12:08 字數 1467 閱讀 3763

使用c/c++指標時,一定要區分清楚指標所占用的記憶體和指標所指向的記憶體。指標一經定義,無論初始化與否,系統將為其分配乙個4位元組(32位系統,另外64位系統為8位元組)的記憶體,即為指標所占用的記憶體。該記憶體存放指標所指向的變數的位址,此位址對應乙個記憶體,即為指標所指向的記憶體。對指標進行操作,也就分為對指標所占用的記憶體進行操作和對指標所指向的記憶體進行操作兩種情況。前者是直接對記憶體進行操作,形同與普通變數的情況,一般不容易出錯;後者是間接對記憶體進行操作,如果此記憶體由於各種原因而不可讀或不可寫(例如系統占用的記憶體、未分配的記憶體、空記憶體、釋放後的記憶體、不可寫或不可讀的記憶體、越界的記憶體等等),那麼就會出現錯誤。下面討論的均是由於對指標所指向的記憶體進行不正確操作而產生的問題:

1. 引用未初始化的指標(此時指標所指向的記憶體是隨機的,通常指向系統占用的或未分配的記憶體,不可讀寫)

例如:

int main()

int main(){

char* pstr=test();

strcpy(pstr,"hello world!");

cout程式可執行,但輸出字串pstr將出現亂碼:

5. 引用指向常量的指標 寫入位置出錯(此時指標所指向的記憶體是常量區記憶體,可讀不可寫)

例如:int main(){

char* pstr="12345";

strcpy(pstr,"hello world!");

cout執行程式將出現:

6. 引用指向棧區陣列的指標(操作中通過指標訪問了越界的記憶體)

例如:int main(){

char str[12];

char* pstr=str;

strcpy(pstr,"hello world!");

cout執行程式將出現:

7. 引用指向堆區陣列的指標(操作中通過指標訪問了越界的記憶體)

例如:int main(){

char* pstr=new char[12];

strcpy(pstr,"hello world!");

cout執行程式將出現:

總結:上述問題雖然都是小問題,但涉及到通過指標跨函式使用記憶體(即主調函式呼叫了以指標作為引數或者以指標作為返回值的函式)時,容易出現錯誤。前面程式例項中呼叫strcpy()和test()函式出錯就是這麼一種簡單的情況,當函式呼叫關係更加複雜的時候,上述問題就需要引起足夠的重視。

C 初學者容易遇到的幾個錯誤

最近要用到visual c 來開發一些程式,呵呵 以前上學的時候學的是c 對visual c 不是很了解,基本是從頭學起啊,為了以後,便於總結,寫下一些,除錯手冊,便於總結 第乙個錯誤 故意注釋掉 include stdafx.h fatal error c1010 unexpected end o...

初學者易犯的的錯誤

使用者類 public class user private int id public int getid return this.id public void setid int id this.id id 測試類 public class test user user new user use...

總結幾個PHP初學者易犯的變數錯誤問題

這是結合本人自己在學習php時最容易犯的錯誤。希望對大家一起交流。1.在php中變數是有大小寫之分的。自己定義的變數,如 username,username,username是不同的三個變數名,不要以為是同乙個變數名 在使用get方法時,變數也是有大小寫之分。如 http testserver ch...