2015-11-24 37 views
-2

這個問題在過去很可能已被回答(很多次),但我無法通過搜索找到任何此類答案。無論如何,這是一個不錯的問題。是否可以釋放()函數返回的指針?

我創建了一個小函數(粗略地)做非標準的GCC函數strdup()。你給它傳遞一個字符串,然後它檢查大小,爲新字符串分配足夠的內存並返回它(或NULL)。但是,無論出於何種原因,我似乎無法在調用函數中釋放該指針。運行時出現seg故障或「無效指針」錯誤。

我懷疑這個問題只是由於我試圖釋放的指針與最初發送給malloc的指針不一樣,並且這可以通過將雙指針傳遞給該函數並賦予它新的字符串,並且根本不返回任何內容,但令我困惑的是,我可以成功釋放由「官方」strdup()函數返回的指針,而沒有任何問題。是什麼賦予了?

下面是代碼:

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

char *strdup2(char *buf); 

int main() 
{ 
    char *str1, *str2; 

    str1 = strdup("This is the first test!"); 
    str2 = strdup2("This is the second test!"); 
    printf("%s\n%s\n", str1, str2); 

    free(str1); 
    puts("First pointer successfully freed."); 
    free(str2); 
    puts("Second pointer successfully freed."); 
    return 0; 
} 

char *strdup2(char *buf) 
{ 
    size_t len = strlen(buf)+1; 
    char *str = malloc(len); 
    if (str == NULL) 
      return NULL; 
    memcpy(str, buf, len); 
    return buf; 
} 

當運行它,我得到:

This is the first test! 
This is the second test! 
First pointer successfully freed. 
zsh: segmentation fault (core dumped) 
+1

你應該總是'免費'你'malloc'(直接或間接)。無論你在哪裏調用'malloc'都沒關係。 –

+0

strncpy會比memcpy更好地服務你,因爲你首先要退出\ 0 –

+0

@JoachimPileborg確實,從實際或從C標準的角度來看,它在哪裏並不重要。然而,從程序設計的角度來看,它很重要! – Lundin

回答

6
return buf; 

您應該返回str,指針到剛分配的內存。

+0

耶穌。我的臉現在正在發光。我盯着這個東西10分鐘,不知何故錯失了那些顯而易見的東西。我想可能在凌晨3點這樣做並不是最好的主意。 – Roflcopter4

1

是可能的。如果指向的內存通過malloc系列函數分配,則可以釋放函數返回的指針。
在你的情況,你應該返回str代替buff

+1

謝謝。從上面的答覆中複製我的評論:「耶穌。我的臉現在正在發光。我盯着這個東西10分鐘,不知何故錯失了那些顯而易見的東西。我想也許在凌晨3點這樣做並不是最好的主意。「 – Roflcopter4

+0

它發生了.... :) – haccks

2

你不回的malloc() -ed指針,你回到你的參數,所以它在你的代碼中的錯誤。

更一般地說,如果函數文檔指定可以這樣做,則只能由函數返回的指針free()

2

在你的函數strdup2你應該改變:

return buf; 

由:

return str; 

你的段錯誤來自於事實,你正在試圖釋放一個指針,是不是一個你malloc() - 但只是一個只讀字符串的參數。

+1

謝謝。要複製我上次回答的評論:」耶穌。我的臉現在正在發光。我盯着這個東西10分鐘,不知何故錯失了那些顯而易見的東西。我想可能在凌晨3點這樣做並不是最好的主意。「 – Roflcopter4