char a[] = "hello world"; // 12 bytes (含 \0)
char* p = a;
sizeof(a); // 12
sizeof(p); // 4 (指標大小,非指向內容大小)
**C/C++ 無法從指標得知指向記憶體大小**,除非分配時記錄。
**陣列作參數退化為指標**:
void Func(char a[100]) {
sizeof(a); // 4 (指標),而非 100
}
void GetMemory(char* p, int num) {
p = (char*)malloc(sizeof(char) * num); // 修改的是副本 _p
}
void Test() {
char* str = nullptr;
GetMemory(str, 100); // str 仍為 nullptr
strcpy(str, "hello"); // 崩潰
}
編譯器為參數建副本 _p,函數內修改 _p 不影響實參 p。且每次呼叫洩漏一塊記憶體 (未 free)。
void GetMemory2(char** p, int num) {
*p = (char*)malloc(sizeof(char) * num);
}
GetMemory2(&str, 100); // 傳址
char* GetMemory3(int num) {
char* p = (char*)malloc(sizeof(char) * num);
return p;
}
str = GetMemory3(100); // 直接接收
// ❌ 返回棧記憶體指標
char* GetString() {
char p[] = "hello world"; // 棧上
return p; // 函數結束 p 銷毀,返回垃圾指標
}
// ✅ 返回靜態區字串字面值 (但設計錯誤)
char* GetString2() {
char* p = "hello world"; // 靜態區,唯讀
return p;
}
std::string。