2016-09-08 57 views
-1

我想用我有一點C代碼找到問題。調試器說,當我嘗試從指針釋放MEM發生錯誤:使用免費()在分割錯誤

int main(int argc, char *argv[]){ 
    char *desc = malloc(30 * sizeof(char)); 
    if(desc == NULL)      
    { 
     fprintf(stderr, "Error - cannot allocate memory\n"); 
    } 
    desc = "Debug this program."; 
    printf("Description: %s\n", desc); 
    free(desc);//break point here 
    int cpid = fork(); 
    .... 
+1

您試圖釋放一個文字字符串的地址,這是非法的。 – LPs

+2

此外,從字符串文字分配分配的指針幾乎總是錯誤的。如果您想將文字複製到'desc'中,請使用'strcpy'。 – Actorclavilis

+0

請注意,sizeof(char)總是1.它是對象大小的度量單位。 –

回答

6

您重新分配desc,然後釋放一個指向字符串常量,這是非法的,它會導致分段錯誤。

您顯然未能理解malloc()的作用,malloc()向操作系統請求存儲器,並返回一個指向您可以在程序中使用的有效存儲器的指針。

之後你malloc()你可以使用內存,但不是所有的指針需要我malloc()編輯。例如,你可以有指向字符串的指針,它們也很有用。

但你不能傳遞任何東西free()除非它是由malloc()/calloc()/realloc()返回。一個指向字符串的指針或者保存變量的地址不是這樣一個指針,並且將它傳遞給free()是未定義的行爲。

如果您知道您必須(例如)分配大量可能會溢出堆棧的內存,或分配可在運行時計算的未知內存量,請僅使用malloc()。否則,不要。

+0

謝謝!這真的清除了它並解釋了一些事情。我在操作系統課程中,並且真誠地對我感到困惑。 – MaddieSun

1

你試圖釋放一個文字字符串的地址,這是非法的。

使用您可以使用的文字字符串初始化一個malloc字符串,例如, strcpy

strcpy(desc, "Debug this program."); 

你也應該退出/終止你的程序在malloc情況下失敗。

+0

謝謝!!!後來我退出了我的程序(在那裏我放置了....是一個子進程和我的退出()調用) – MaddieSun

3

首先,你分配分配給desc

char *desc = malloc(30 * sizeof(char)); 

然後你用字符串文字的第一個字符的地址重新分配指針"Debug this program."

desc = "Debug this program."; 

因此指針動態內存,並將其地址分配的內存地址丟失了。

然後你想釋放由字符串字面

free(desc);//break point here 

但是字符串常量有靜態存儲時間和不能使用標準功能free被釋放佔用的內存。

而是這個賦值語句

desc = "Debug this program."; 

你應該使用標準的C函數strcpy,例如

strcpy(desc, "Debug this program."); 
+0

非常感謝! (: – MaddieSun

+0

@MaddieSun根本沒有,歡迎您:) –

-1

簡單地說(和讀取其他的解決方案)的,內存是不是你刪除。

+0

這是個不好的答案,不會回答這個問題。這將作爲評論更好。即使如此,C語言中應該使用'malloc()'和'free()',說「內存不是你的要刪除的」比說明更容易。 – dckuehn