2017-01-23 47 views
-2

我不太確定我得到如何malloc完全工作。mallocing字符串在C

#include <stdio.h> 
#include <stdlib.h> 

int main() { 

char * string = (char*) malloc(sizeof(char)); 
string = "abc"; 

int * test = (int*) malloc(1 * sizeof(int)); 
*(test) = 5; 
*(test + 1) = 6; 


} 

我預計到輸出錯誤,因爲我指定字符串的值是不是隻有一個字符更大但似乎編譯就好了。

我有幾個問題:

  1. 會在哪裏 '串' 現在得救?它是在我分配的一個空間後堆上的內存空間嗎?

  2. 爲什麼字符讓我直接指定int只能通過指針?

我真的不知道我在做什麼這裏

+1

爲什麼你[鑄造的malloc的返回值(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)? – PaulMcKenzie

+0

@PaulMcKenzie我跟隨MIT開放課程和所使用的PPT例如這一點,但您的權利,這似乎非常愚蠢的,感謝您的額外信息 – DarkInc

+0

'*(測試+ 1)= 6;'寫出界 –

回答

1

除了其他答案:

你可能想這樣的:

char *string = (char*) malloc(sizeof(char) * 100); // allocate space for 100 chars 
strcpy(string, "abc"); // copy the "abc" into the memoory location pointer by string 

,而不是這樣的:

char *string = (char*) malloc(sizeof(char)); // << this allocates only a single char 
string = "abc"; 

而且

*(test) = 5; 
*(test + 1) = 6; 

更好寫成:

test[0] = 5; 
test[1] = 6; 

這是嚴格等價的,它只是一個可讀性問題。

分配太少內存:

如果你只有1字符如下分配內存:

char *string = (char*) malloc(sizeof(char)); // allocate space 1 char 
strcpy(string, "abc"); // copy the "abc" into the memoory location pointer by string 

那麼你的程序仍然會編譯罰款,但在運行時字符串將部分複製到未分配的內存,這會導致未定義的行爲(谷歌「未定義的行爲」)。

+0

編程的幾個小項目,但我只爲其分配一個字符空間,那豈不是可以再當我爲另一個變量分配空間,以保持「bc \ 0」的地址將被覆蓋?編輯:是啊,你回答之前,我的意見是成品感謝 – DarkInc

+0

@DarkInc看到編輯答案 –

+0

魔術數字是非常不好的做法。以壞習慣開始開發新程序員是一個壞主意。 –

1

會在哪裏「串」現在得救?

char * string = (char*) malloc(sizeof(char)); 
string = "abc"; 

string現在指向「ABC」(一個文本字符串) - 最初的動態分配(在堆)中已經丟失的軌道,你有內存泄漏。

3

此代碼

string = "abc"; 

將字符串常量​​到string變量,它是一個char *的地址。您的malloc()調用返回的內存地址(string)會被覆蓋並丟失。

0

我會給你一個真實的例子。

假設A先生住在地址「abc」。現在,一些B先生開始住在某個地址「xyz」。很快,B先生的地址「xyz」被重新命名爲「abc」。現在,如果你到地址「abc」,你會遇到B先生,而不是A先生。但是,這並不意味着A先生被拆除了。這僅僅意味着A先生的居住區現在沒有可到達的地址,並且已經丟失。

同樣,存儲你malloc「版,以string,然後重新分配給string‘ABC’,是指,string早些時候曾一個地址malloc」版內存。稍後,將「abc」寫入某個存儲器,並將該存儲器的地址存儲在string中。因此,永遠失去了被稱爲內存泄漏的編輯內存。

0

編譯器不會阻止你做一些允許的操作 - 但是你可能會得到1)的警告,因爲string被分配並且在被重新分配之前沒有被使用(假設編譯器被請求輸出相關警告)。

至於2),你調用的函數碰巧是malloc,它的參數碰巧對於你想用malloc返回的指針的用法來說太小,但由於語法是正確的,編譯器不會抱怨。

答到

1)string點​​和malloc以前的值丟失

2)你可以做test[0] = 5;爲好。

2)的行爲是未定義行爲(訪問數組越界)。

0

首先動態分配內存,請求的大小爲一個字符。

char * string = (char*) malloc(sizeof(char)); 

然後指針重新分配字符串文字「abc」的第一個字符的地址。

string = "abc"; 

結果是動態分配的內存地址丟失,程序中有內存泄漏。

如果程序將用C++編寫然後此語句

string = "abc"; 

可能產生一個編譯器診斷消息,因爲在C字符串文字++有類型的恆定字符陣列和指針的string shuld聲明如下

const char *string; 

至於字符串文字,則它們具有靜態存儲持續時間,並在主獲得控制權之前分配。通常所有字符串文字都是所謂的字符串文字池中的地方。

而是這種說法

string = "abc"; 

,你可以寫

strcpy(string, "abc"); 

在這種情況下,程序是未定義行爲。但由於通常功能malloc分配的最小內存範圍等於等於16個字節的段的值,因此它可以繼續成功工作。

+0

這是一個C問題。 C++代碼的行爲是無關緊要的 –

+0

@ M.M沒有任何「不相關的」信息。在C 1中)指針也可以用qualificator const聲明,在C中可以使用與C++中相同的方法; 2)在C和C++中對同一構造進行任何比較都非常有用,有助於理解更好的C和C++。 –