簡體   English   中英

在函數內部使用malloc並返回本地指針

[英]Using malloc inside a function and return local pointer

在C中做這樣的事情有什么問題嗎

char* wrap(char *inp) {
    char *newstr;
    newstr = (char *)malloc( sizeof(char) * 4);
    newstr[0] = 'A';
    newstr[1] = inp[0];
    newstr[2] = 'B';
    newstr[3] = '\0';
    return newstr;
}

基本上我想知道在函數內部使用malloc並返回局部變量存在問題。

你沒有返回一個局部變量; 您傳回存儲在一個局部變量的

這段代碼沒問題(盡管malloc上的malloc是不必要的); 在一個函數中分配內存並在另一個函數中釋放它是一種有點常見的模式。

只要你在某個地方調用free()以避免內存泄漏,這就完全沒問題了。 程序設計的一部分應該是定義每個指針的“所有者”。 這種所有權可以轉移,因此您應該在指針的整個生命周期內跟蹤所有者。 指針變為未使用時的所有者應負責調用free()

這是完美的, 只要你確定調用者可以免費調用以避免內存泄漏..這對小程序來說不是一個大問題,但是當程序變得復雜時,相信我,你會關心很多比從一個假定的自包含函數釋放指針更多的東西..

但是(向下),有一個更令人滿意的解決方案,標准C庫本身使用。 使用緩沖區! (拍手,拍手)

你知道,有一個原因,例如fgets函數要求你提供一個字符指針作為第一個參數,這樣它就可以寫入它而不是返回一個malloc指針。

例如 ..

#include <ctype.h>
#include <string.h>

void toLower(char *buf, const char *s) {
    for(int i = 0; s[i]; ++i)
        buf[i] = tolower(s[i]);
}
int main(int argc, const char ** argv) {
    const char *s = "ThAt'S a BiG sTrIng";
    char lower_version[strlen(s)];
    toLower(lower_version, s);
    printf("Original Version: %s\nLower Version: %s\n\tTada !\n", s, lower_version);
}

這樣,您不必擔心在以后的使用中如何處理變量。
您將此問題留給函數調用者來處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM