簡短的回答:是的,這是可能的
龍回答:malloc(some_size)
分配some_size
空間,並返回一個指向分配塊的開始(或NULL
失敗時)的地址。在做ret = (char*)malloc(sizeof(char) * length);
ret時,指定內存塊的指針指向內存塊length
char
s(請注意,sizeof(char) == 1
因此您可以將其刪除)。
內存是你的,直到你釋放它,即使在函數返回後,所以,在執行完upperCase(...)
之後,該內存仍然屬於你。唯一的問題是,指針ret
被分配在本地存儲的(auto)
堆棧上,這意味着當它的作用域爲「死」(在你的情況下 - upperCase(...)
函數的作用域),因此,你將不知道該內存的位置是但是由於您從函數返回ret
,它所保存的值(這是您分配的內存的地址)將傳遞到main
的ret
,這基本上意味着您很好。
我認爲我應該強調的最後一件事是,返回局部變量始終完成。例如int increment_by_one(int x){int y = x + 1; return y;}
。這是一個非常簡單的函數,返回當地的值int y
。由於返回的值是我們需要的全部值(即值爲x+1
),因此值(值)存儲在局部變量中是可以的。因爲ret
裏面upperCase
包含分配的地址,所以「die」結束後,upperCase
結束,因爲它保存的值(地址)被傳遞。
char * upperCase(const char* s)
{
char * ret = NULL; // local variable -> will die after upperCase ends
size_t length = strlen(s) + 1; // local variable -> will die after upperCase ends
ret = (char*)malloc(sizeof(char) * length); // ret assigned with address to memory
for (size_t i = 0; i < length; i++) { // local variable -> will die after it's scope (the for loop) ends
ret[i] = toupper(s[i]);
}
return ret; // said address is returned to main (local variable ret now dies peacefully after fulfilling its duty)
}
int main()
{
char* ret = NULL; // local variable -> will die after main ends
char* input = "HelloWorld"; // local variable -> will die after main ends
ret = upperCase(input); // ret gets the address allocated in upperCase
printf("value = %s", ret);
free(ret); // address is freed
}
2注:
- 無需鑄造malloc的返回值,這意味着
ret = (char*)malloc(sizeof(char) * length);
應ret = malloc(sizeof(char) * length);
- 沒有必要
sizeof(char)
,因爲它是1
,這意味着你可以進一步縮短至ret = malloc(length);
malloc
可能會失敗。在這種情況下,它會返回NULL
所以每次ret = malloc(...);
後,你應該檢查值像if(!ret){// handle error}
或if(ret != NULL){// do something}
和這樣
是的,你可以做到這一點。問題在於返回指向不存在的事物的指針,但是你的'malloc'繼續存在,直到你釋放它。另一種選擇是將輸出指針作爲參數,這樣內存管理留給調用者。 – Ryan
'sizeof(char)'的定義是1。 – melpomene
'toupper(s [i])'具有未定義的行爲,如果s [i]'爲負數。你應該把它轉換成'unsigned char'。 – melpomene