這個問題在過去很可能已被回答(很多次),但我無法通過搜索找到任何此類答案。無論如何,這是一個不錯的問題。是否可以釋放()函數返回的指針?
我創建了一個小函數(粗略地)做非標準的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)
你應該總是'免費'你'malloc'(直接或間接)。無論你在哪裏調用'malloc'都沒關係。 –
strncpy會比memcpy更好地服務你,因爲你首先要退出\ 0 –
@JoachimPileborg確實,從實際或從C標準的角度來看,它在哪裏並不重要。然而,從程序設計的角度來看,它很重要! – Lundin