2017-06-17 138 views
0

所以我在這個相當新的,對不起,如果這聽起來像一個愚蠢的問題的malloc函數(使用malloc正確)

我想了解的malloc,並創建一個非常簡單的程序,它將打印「ABC」用ASCII碼

這裏是我的代碼(就是我們的教授教我們)到目前爲止

char *i; 
i = malloc(sizeof(char)*4); 
*i = 65; 
*(i+1) = 66; 
*(i+2) = 67; 
*(i+3) = '\0'; 

什麼,我不明白的是,爲什麼我必須把malloc的呢? 教授告訴我們,程序不會運行沒有malloc, ,但是當我嘗試運行它沒有malloc時,程序運行得很好。 那麼malloc的功能呢? 我什至使用它的權利?

任何幫助,或解釋將非常感激

+1

沒有它,'i'未初始化並指向隨機存儲器。 – melpomene

+1

「程序運行良好」。這不好。 C有這個未定義行爲的概念。觸發UB(例如通過訪問無效內存)會導致不可預知的行爲,包括出現工作,但可以隨時停止工作併產生任何行爲。 – kaylum

+0

這意味着,您可能會感到幸運/不幸,並且在運行時不會發現問題。 – Yunnosch

回答

3

教授告訴我們的程序在沒有malloc的

這並不完全正確運行,正確的措詞將是:「程序的行爲是undefined without malloc()」。

這樣做的原因是,

char *i; 

只是聲明瞭一個指針char,但沒有初始化 - 該指針指向一些不確定位置。你可能只是幸運在寫作價值這個「隨機」的位置工作,不會導致崩潰。我個人稱之爲不幸,因爲這隱藏了您程序中的錯誤。 未定義的行爲只是意味着任何事情都可能發生,包括「正確的」程序執行。

malloc()會動態請求一些可用的內存並返回指向該內存的指針,因此在malloc()之後,您知道i指向您可以使用的4字節內存。如果malloc()由於某種原因(沒有更多內存可用)而失敗,則返回NULL - 在寫入*i之前,您的程序應該測試它。

所有這一切,當然程序可以在沒有malloc()的情況下工作。你可以只寫

char i[4]; 

i將與房間4個字符的局部變量。


最終側面說明:sizeof(char)被定義爲1,所以你可以只寫i = malloc(4);

+0

非常感謝!你的解釋是如此詳細和易於理解。 至於字符我[4],我知道我也可以這樣做,但我們需要使用指針作業,所以這就是爲什麼我使用它。無論如何,感謝很多! – Sae

+1

@Sae YW!在現實生活中,不要忘記當你不再需要時,從'malloc()'中獲得'free()'內存。當你的程序剛剛退出時,在現代化的平臺上省略'free()'是沒問題的 - 但是在一些真實的項目中,執行會繼續,沒有調用'free()'引入內存泄漏*沒有指針了,但仍然分配內存) –

+0

導致內存泄漏的一種方法是簡單地將'i'分配給別的東西。有一些算法(通常是循環),它可以多次分配一個變量,否則在聲明中分配一個命名好的變量是一個好習慣,不要再分配它,當然,在完成時釋放它。 –

2

不幸的是,「運行良好」的標準證明任何關於一個C程序。大量運行到完成的C程序都有未定義的行爲,這並不會在您的特定平臺上體現出來。

您需要特殊工具才能看到此錯誤。例如,您可以通過valgrind運行您的代碼,並查看它訪問未初始化的指針。

至於malloc,您不必在代碼中使用動態緩衝區。這將是完全正常的分配緩衝中自動記憶,就像這樣:

char buf[4], *i = buf; 
0

您必須爲內存分配空間。在下面的例子中,我沒有分配內存的我,這就造成了分段錯誤(您試圖訪問您沒有訪問內存)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main(void) 
{ 
    char *i; 
    strcpy(i, "hello"); 
    printf("%s\n", i); 
    return (0); 
} 

輸出:分段故障(核心轉儲)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main(void) 
{ 
    char *i; 
    /*Allocated 6 spots with sizeof char +1 for \0 character*/ 
    i = malloc(sizeof(char) * 6); 
    strcpy(i, "hello"); 
    printf("%s\n", i); 
    return (0); 
} 

結果:你好

的malloc允許您創建的空間,所以你可以寫內存中的位置。在第一個例子中,「沒有malloc就無法工作」,因爲我指的是內存中沒有分配空間的地方。