我已經編程很糟糕了很長一段時間,我只是真正意識到。我以前創建了許多將字符串作爲char數組返回的函數(或者至少指向它們的指針)。如何返回在函數中創建的字符數組?
有一天有人指出,當我的函數返回由我的函數指向的char數組已經超出範圍,我現在基本上指向一個隨機位的內存(一個討厭的懸掛指針)。
我沒有真正注意到這一段時間,因爲char數組輸出到控制檯時似乎沒有損壞(可能是因爲沒有時間來覆蓋這些數據)。但是,當我返回通過讀取頻繁被破壞的串行端口而生成的字符串緩衝區(char數組)時,我注意到了這一點。
那麼,我該如何做到最好?
我糟糕的代碼如下:
#include <cstdlib>
#include <iostream>
using namespace std;
char* myBadFunction(){
char charArray[] = "Some string\n";
char* charPointer = charArray;
return charPointer;
}
int main(int argc, char** argv) {
cout << myBadFunction();
return 0;
}
我知道我應該在程序中調用該函數之前也許分配內存或創建一個全局變量把返回的字符串中,但如果我調用的函數被許多不同的程序使用,它應該如何知道事先傳入緩衝區的大小以及應該何時刪除該內存?
下面的代碼也沒有做什麼,我希望它正確:
#include <cstdlib>
#include <iostream>
using namespace std;
void fillArray(char* charPointer){
char charArray[] = "Some string\n"; // Create string
charPointer = charArray; // Not correct, want to fill predefined array with created string
return;
}
int main(int argc, char** argv) {
char predefinedArray[50] = {0};
fillArray(predefinedArray);
cout << predefinedArray;
return 0;
}
我想,以填補該指針解析指向但這並不」在上面的代碼中發生的陣列。
另外,什麼時候應該使用新的[]命令來創建我的數組?需要嗎?什麼時候應該調用它的delete []。
非常感謝這一點,它顯然非常基本,但我一直在做錯了一段時間。
你最好添加你在代碼中寫的代碼。 – Stefanvds 2010-09-17 08:03:03
關於你的問題的第二部分,你將不得不手動循環和複製每個字符到第二個數組或使用'memcpy' ... – st0le 2010-09-17 08:03:50