出於某種原因,其他的答案只是指出,技術細節這是錯誤的,但沒有注意到什麼是真的錯了:你正在返回堆棧上的數組的地址。但是當函數返回時,訪問該數組變成未定義的行爲。其他代碼可以自由覆蓋內存,從而留下最糟糕的垃圾,或者相反,向返回指針後面的內存寫入內容可能會破壞代碼中某些其他完全未連接的部分的重要變量。
如果你想返回一個指針,則必須返回一個指向一個static
對象,也必須返回一個指向東西就堆。這裏是static
情況:保證爲staticArray保留的內存[]將保持其在整個程序的執行預留
char* foo() {
static char staticArray[1024];
return staticArray;
}
使用static
這裏。有,但是,三個缺點呢:
數組大小是固定在編譯時
這通常不是多線程安全的,因爲所有的線程將使用相同的全局分配的內存
您通常無法期望返回的指針後面的數據在函數調用中保持不變。考慮以下代碼:
void bar() {
char* temp = foo();
temp[0] = 7;
}
void baz() {
char* temp = foo();
temp[0] = 3;
bar();
//now temp[0] is 7 !
}
這可能是在某些罕見的情況下可取的,但是,在大多數不是這樣的。
所以,如果你想能夠自由地使用返回的指針後面的內存,你必須爲它的malloc()
內存(當然,它後free()
)。就像這樣:
char* foo(int size) {
return malloc(size);
}
void baz() {
char* sevenBytes = foo(7);
//Do something with seven bytes
free(sevenBytes);
}
void bar() {
char* threeBytes = foo(3);
threeBytes[0] = 3;
baz();
assert(threeBytes[0] == 3); //baz() worked on it's own memory
free(threeBytes);
}
在字符串處理的情況下,有一些在POSIX-2008標準,做內存分配給你,其中strdup()
和asprintf()
提供方便的功能。下面是一些用法示例:
int main() {
char* hello = strdup("Hello");
char* greeting;
if(0 > asprintf(&greeting, "%s World!\nMemory for hello was allocated at %llx", hello, (long long)hello)) {
//error handling
}
printf(greeting);
free(hello);
free(greeting);
}
這將打印出類似這樣:
Hello World!
Memory for hello was allocated at c726de80
什麼是印刷?另外,你在使用什麼編譯器?它在Linux上使用gcc可以正常工作。 – McLovin
放在主要之前的原型。 – BLUEPIXY