1. 程式人生 > >c語言中較常見的由記憶體分配引起的錯誤_記憶體越界_記憶體未初始化_記憶體太小_結構體隱含指標

c語言中較常見的由記憶體分配引起的錯誤_記憶體越界_記憶體未初始化_記憶體太小_結構體隱含指標

1.指標沒有指向一塊合法的記憶體

  定義了指標變數,但是沒有為指標分配記憶體,即指標沒有指向一塊合法的內淺顯的例子就不舉了,這裡舉幾個比較隱蔽的例子。

1.1結構體成員指標未初始化

1 2 3 4 5 6 7 8 9 10 11 struct student { char *name; int score; }stu,*pstu; <br>int main() {   strcpy(stu.name,"Jimy"
);   stu.score = 99; return 0; }  


很多初學者犯了這個錯誤還不知道是怎麼回事。這裡定義了結構體變數stu,但是他沒想到這個結構體內部char *name這成員在定義結構體變數stu時,只是給name這個指標變數本身分配了4個位元組name指標並沒有指向一個合法的地址,這時候其內部存的只是一些亂碼。所以在呼叫strcpy函式時,會將字串"Jimy"往亂碼所指的記憶體上拷貝,而這塊記憶體name指標根本就無權訪問,導致出錯。解決的辦法是為name指標malloc一塊空間。

同樣,也有人犯如下錯誤:

1 2 3 4 5 6 7 8 int main() {   pstu = (struct student*)malloc(sizeof(struct student));   strcpy(pstu->name,"Jimy");   pstu->score = 99;   free(pstu); return 0; }  


為指標變數pstu分配了記憶體,但是同樣沒有給name指標分配記憶體。錯誤與上面第一種情況一樣,解決的辦法也一樣。這裡用了一個malloc給人一種錯覺,以為也給name指標分配了記憶體。

1.2 沒有為結構體指標分配足夠的記憶體

1 2 3 4 5 6 7 8 int main() {   pstu = (struct student*)malloc(sizeof(struct student*));   strcpy(pstu->name,"Jimy");

相關推薦

c語言常見記憶體分配引起錯誤_記憶體越界_記憶體初始_記憶體_結構隱含指標

1.指標沒有指向一塊合法的記憶體   定義了指標變數,但是沒有為指標分配記憶體,即指標沒有指向一塊合法的內淺顯的例子就不舉了,這裡舉幾個比較隱蔽的例子。 1.1結構體成員指標未初始化 1 2 3 4 5 6 7

C語言動態內存的分配

成功 col 釋放內存 否則 turn stdlib.h color span 數組名 動態內存分配:根據需要隨時開辟,隨時釋放的內存分配方式。分配時機和釋放時機完全由程序員決定,由於沒有數據聲明,這部分空間沒有名字。無法像使用變量或數組那樣通過變量名或數組名引用其中的數據

經典String str = new String("abc")記憶體分配問題,研究下字串到底該怎麼樣初始,順便很好的解釋下Java的intern()(在文章結尾)

大佬這個部落格很厲害,解決了我一直以來的困惑; Java中以下兩句有什麼區別呢?String str1="abc";  String str2=new String("abc"); Java把記憶體劃分成兩種:一種是棧記憶體,一種是堆記憶體。  在函式中定義的一些基本型別

C++ 類特殊的成員變數(常變數、引用、靜態)的初始方法

有些成員變數的資料型別比較特別,它們的初始化方式也和普通資料型別的成員變數有所不同。這些特殊的型別的成員變數包括: a.引用 b.常量 c.靜態 d.靜態常量(整型) e.靜態常量(非整型)     常量和引用,必須通過引數列表進行初始化。     靜態成員變

malloc到初始記憶體

在最近開發過程中發現一個malloc到未初始化記憶體的錯誤. 在使用CLISH(一款命令列開源軟體)的時候,每次這個程式退出的時候都會發生core dump,錯誤為invalid pointer: 0x00007ffff02b35d8 . 但是這個錯誤只在某一臺機器上發生錯

c語言分配記憶體方式有哪些?c語言常見記憶體錯誤有哪些?

記憶體分配方式有三種:   1、從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。   2、在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放

g++ 記憶體分配c 語言的 陣列越界問題 (一道有趣的面試題)

首先是一段程式: # include <stdio.h> int main(int argc, char* argv[]){ int i = 0; int arr[3] = {0}; for(; i<=3; i++){ arr[i]

c語言記憶體的動態分配與釋放(多維動態陣列構建)

一. 靜態陣列與動態陣列    靜態陣列比較常見,陣列長度預先定義好,在整個程式中,一旦給定大小後就無法再改變長度,靜態陣列自己自動負責釋放佔用的記憶體。    動態陣列長度可以隨程式的需要而重新指定大小。動態陣列由記憶體分配函式(malloc)從堆(heap

C語言記憶體分配

一、static在C語言裡面可以用來修飾變數,也可以用來修飾函式。 1、 先看用來修飾變數的時候。變數在C語言裡面可分為存在全域性資料區、棧和堆裡。 其實我們平時所說的堆疊是棧而不是堆,不要弄混。 例如:在file.c中 int a ; int main() {

C語言記憶體分配問題和C語言記憶體

C語言記憶體分配問題 1、C中記憶體分為四個區棧:用來存放函式的形參和函式內的區域性變數。由編譯器分配空間,在函式執行完後由編譯器自動釋放。 堆:用來存放由動態分配函式(如malloc)分配的空間。是由程式設計師自己手動分配的,並且必須由程式設計師使用free釋放。如果忘記用

C語言常見記憶體錯誤

型別 1:記憶體未分配成功,卻使用了它。 方   法:在使用之前檢查指標是否為NULL。              1)當指標p是函式的引數時,在函式入口處用語句assert(p!=NULL)進行斷言檢查。              2)當使用malloc或new來

模擬實現c語言的動態記憶體分配malloc函式

動態儲存器分配器維護著一個程序的虛擬的儲存器區域,稱為堆(heap)。分配器將堆視為一組不同大小的塊的集合來維護。每個塊就是一個連續的虛擬儲存器片(chunk),要麼是已經分配的,要麼是空閒的。 我們這裡把記憶體堆空間模擬為一個位元組陣列buf[1000],塊的資料結構為:

C語言的編譯時分配內存

一個 地址 移植 eap 也會 功能 空間大小 全局區 限定 1.棧區(stack) --編譯器自動分配釋放,主要存放函數的參數值,局部變量值等; 2.堆區(heap) --由程序員分配釋放; 3.全局區或靜態區 --存放全局變量和靜態變量;程序結束時由系統釋放,分為全局初

C語言內存分配問題:

保存 line data 自動 c語言 再次 變量 cti 初始化 推薦: C語言中內存分配 Linux size命令和C程序的存儲空間布局 本大神感覺,上面的鏈接的內容,已經很好的說明了; 總結一下: 對於一個可執行文件,在linux下可以使用 size命令列出目標文

VC++和C語言常見數據類型轉換為字符串的方法

char* 北京 相同 字符指針 ascii bst sdn sprint 出現 1。短整型(int) itoa(i,temp,10);///將i轉換為字符串放入temp中,最後一個數字表示十進制 itoa(i,temp,2); ///按二進制方式轉換 2。長整型(long

常見位操作及運算應用舉例:1,C語言位運算子異或“∧”的作用2,異或運算的作用3,&(與運算)、|(或運算)、^(異或運算)

  1 C語言中位運算子異或“∧”的作用: 異或運算子∧也稱XOR運算子。它的規則是若參加運算的兩個二進位同號,則結果為0(假);異號則為1(真)。即0∧0=0,0∧1=1,1∧1=0。如: 即071∧052,結果為023(八進位制數)。 “異或”的意思是判斷兩個相應的位值是否為“

C語言儲存類別、連結與記憶體管理

  第12章 儲存類別、連結和記憶體管理 通過記憶體管理系統指定變數的作用域和生命週期,實現對程式的控制。合理使用記憶體是程式設計的一個要點。 12.1 儲存類別 C提供了多種不同的模型和儲存類別,在記憶體中儲存資料。 被儲存的每一個值都佔用一定的實體記憶體;C語言把這樣一塊記憶體稱為物件

C語言程式設計時常見錯誤,看看你招了嗎?

雲上傘 C編譯的程式對語法檢查並不像其它高階語言那麼嚴格,這就給程式設計人員留下“靈活的餘地”,但還是由於這個靈活給程式的除錯帶來了許多不便,尤其對初學C語言的人來說,經常會出一些連自己都不知道錯在哪裡的錯誤。看著有錯的程式,不知該如何改起,通過對C的學習,積累了一些C程式設計時常犯的錯誤,

C語言記憶體重疊

首先我們先看這樣一道題:有n個整數,使前面各數順序向後移m個位置,最後m個整數變成最前面m個數,見如下圖,寫一函式實現以上功能,在主函式中輸入n個整數和輸出調整後的n個數。 我們先來分析一下; 有一下兩種情況,(1)後面的數移到前面;(2)前面的數移到後面。 1中反向拷貝會出現記憶體重

C語言的生命週期,作用域,預設值,記憶體區域,連結屬性

1、全域性變數:定義在函式外部的變數 生命週期:從程式執行開始建立,程式退出銷燬; 作用域:從定義該變數開始一直到檔案的結束; 預設值:0; 記憶體區域:全域性(靜態)變數區; 連結屬性:外部(可以在其他檔案中引用)。 注意:全域性變數只需在一個原始檔中定義,就可以作用