string str1;
cin >> str1;
char *Num1 = new char[str1.length()];
int *num1 = new int[str1.length()];
str1.copy(Num1, str1.length(), 0);
for (int i = 0; i < str1.length(); i++) {
*num1 = *Num1 - '0'; // 轉數字
cout << *num1 << endl;
cout << num1 << endl; // 輸出地址
num1++; // ← 修改指針本身
Num1++;
}
// 第二次循環輸出 num1 時地址已偏移,值為垃圾/崩潰
指針算術 (`num1++`) 永久改變了指針指向的地址**。第一次循環結束後,`num1` 指向分配內存末尾之後,第二次循環讀取非法內存。
int *num1 = new int[str1.length()];
int *base = num1; // 保存起始地址
for (int i = 0; i < str1.length(); i++) {
*num1 = *Num1 - '0';
cout << *num1 << ' ' << num1 << endl;
num1++; Num1++;
}
num1 = base; // 重置指針
for (int i = 0; i < str1.length(); i++) {
cout << *num1 << ' ' << num1 << endl;
num1++;
}
for (int i = 0; i < str1.length(); i++) {
num1[i] = Num1[i] - '0';
cout << num1[i] << ' ' << &num1[i] << endl;
}
// 後續直接用 num1[i] 訪問,指針 num1 始終指向數組首地址
#include
#include
string str1; cin >> str1;
vector nums;
nums.reserve(str1.length());
for (char c : str1) {
if (isdigit(c)) nums.push_back(c - '0');
}
// 輸出
for (size_t i = 0; i < nums.size(); ++i)
cout << nums[i] << ' ' << &nums[i] << endl;
// vector 內存連續,&nums[i] 等價於 nums.data() + i
原代碼 `new char[]` / `new int[]` **未調用 `delete[]`**。修正版必須配對釋放:
delete[] Num1;
delete[] num1; // 或 base
方案三 `vector` 自動管理內存,無泄漏風險。
| 操作 | 效果 | 是否修改指針值 |
|---|---|---|
ptr++ | 指向下一個元素 | 是 (永久) |
ptr[i] | 訪問第 i 個元素 | 否 |
*(ptr + i) | 訪問第 i 個元素 | 否 (臨時計算) |
**指針算術會改變指針本身**。需保存基地址或改用下標/標準容器訪問。現代 C++ 優先用 `vector