[問題] 不直接動變數的情況下 修改其值

看板C_and_CPP (C/C++)作者 (akai)時間14年前 (2011/08/25 12:01), 編輯推噓14(14032)
留言46則, 19人參與, 最新討論串1/1
不知道怎麼說明比較清楚 舉個範例小程式 int main() { int test = 0; . . . . cout<<"test:"<<test; } 有可能整個程式中除了宣告和cout兩行之外不再鍵入test 使用其他內容來使最後 test輸出的值改變嗎? 想了又想 目前想到用pointer 但是不能再出現其他test 這樣就沒辦法 指向了 究竟該怎麼做呢? ====================================================================== 剛得到解答是 int* abc; abc=&abc; <- 這裡我compile 會error 要改為 (int*)&ptr abc++; (maybe abc--;)<-這是本身附註的 *abc=1111; 原理是? ◆ From: 123.0.34.42

08/25 12:08, , 1F
你就算用指標,也要鍵入test以取得其位址~~
08/25 12:08, 1F

08/25 12:11, , 2F
overflow
08/25 12:11, 2F

08/25 12:13, , 3F

08/25 12:22, , 4F
對 cout 函數做 API Hook (override 掉原本的處理)
08/25 12:22, 4F

08/25 12:26, , 5F
int test = (0,1);
08/25 12:26, 5F

08/25 12:28, , 6F

08/25 12:28, , 7F
cout << ++test << endl;
08/25 12:28, 7F

08/25 12:28, , 8F
nt test = 0;
08/25 12:28, 8F

08/25 12:28, , 9F
cout << --test << endl;
08/25 12:28, 9F

08/25 12:29, , 10F
int test = 0;
08/25 12:29, 10F

08/25 12:29, , 11F
int *ptr = reinterpret_cast<int *>(&ptr)+1;
08/25 12:29, 11F

08/25 12:29, , 12F
*ptr=123; //不保證對 可能會錯
08/25 12:29, 12F

08/25 12:30, , 13F
cout << "test:" << test;
08/25 12:30, 13F

08/25 12:35, , 14F
哼哼,不要淨用一些未定義行為啊 (F大臉
08/25 12:35, 14F

08/25 12:35, , 15F
08/25 12:35, 15F

08/25 12:50, , 16F
#define test 1
08/25 12:50, 16F

08/25 12:58, , 17F
cutecpu用++和--好有道理 XDD
08/25 12:58, 17F

08/25 13:23, , 18F
## 運算子如何 xD
08/25 13:23, 18F

08/25 13:39, , 19F
囧下面大家都還是用到test阿...
08/25 13:39, 19F

08/25 13:40, , 20F
直接在宣告一個int tmp; 然後tmp跟test的記憶體...
08/25 13:40, 20F

08/25 13:51, , 21F
樓上不也用到 &test ?
08/25 13:51, 21F

08/25 13:57, , 22F
xxxx9659 大的方法跟我得到的解答最接近
08/25 13:57, 22F
※ 編輯: akai104 來自: 123.0.34.42 (08/25 14:12)

08/25 14:07, , 23F
※ 編輯: akai104 來自: 123.0.34.42 (08/25 14:13)

08/25 14:23, , 24F
樓上..想不到啊..我一開始想法是,多一個namespace...
08/25 14:23, 24F

08/25 14:24, , 25F
反正程式碼也沒有 using namespace std;
08/25 14:24, 25F

08/25 14:25, , 26F
i大的方法確實是厲害 不過題目果然是要pointer
08/25 14:25, 26F

08/25 14:26, , 27F
剛看了一下 上2篇文章剛好有pointer 好像跟我這有點關係
08/25 14:26, 27F

08/25 14:27, , 28F
不適合用 pointer, 用它搞不會百分百正確。
08/25 14:27, 28F

08/25 14:27, , 29F
這解答好像也是未定義行為啊...
08/25 14:27, 29F

08/25 14:30, , 30F
未定義行為 是什麼意思?
08/25 14:30, 30F

08/25 14:31, , 31F
原理是自動變數會從Heap要memory來放
08/25 14:31, 31F

08/25 14:34, , 32F
我以為是local變數會放在stack
08/25 14:34, 32F

08/25 14:34, , 33F
不過第一時間的想法就是再放一個跟著宣告的的local變數
08/25 14:34, 33F

08/25 14:36, , 34F
兩個位址會連續,用指標指向另一個再做加減即可存取
08/25 14:36, 34F

08/25 14:36, , 35F
未定義行為就是程式語言規範沒有規定或是讓各家編譯自己
08/25 14:36, 35F

08/25 14:37, , 36F
去發揮.
08/25 14:37, 36F

08/25 14:38, , 37F
原理是自動變數會從Heap要memory來放?驚
08/25 14:38, 37F

08/25 15:19, , 38F
他不是放在stack嗎? 假如是這樣 那也不需要malloc啦
08/25 15:19, 38F

08/25 15:48, , 39F
這題可能要operator overlapping吧!
08/25 15:48, 39F

08/25 19:37, , 40F
我那個方法應該用不到&test吧...只要用到&tmp就好了..
08/25 19:37, 40F

08/25 20:11, , 41F
阿對 :P 抱歉記錯了 是stack
08/25 20:11, 41F

08/25 22:43, , 42F
雖然跟 c 大的有點像 http://pastie.org/2428143
08/25 22:43, 42F

08/25 23:26, , 43F
哈哈,樓上有創意唷^_^
08/25 23:26, 43F

08/26 10:15, , 44F
憑良心講,我很希望想玩弄指標的人有意識到自己在玩火...
08/26 10:15, 44F

08/26 10:16, , 45F
另外前置處理的 ## 可以避開不能打 test 的限制啊 xDDD
08/26 10:16, 45F

08/26 10:18, , 46F
比方說te##st XDD
08/26 10:18, 46F
文章代碼(AID): #1ELSaCzL (C_and_CPP)
文章代碼(AID): #1ELSaCzL (C_and_CPP)