[問題] 如何將int指標 指向struct的位置

看板C_and_CPP作者 (隨便殺)時間15年前 (2010/09/24 18:47), 編輯推噓6(6025)
留言31則, 5人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 如標題 現在我需要在一個int型態的指標裡 指向struct的記憶體位置 EX: int *a struct k 內容 0x13 XXXX(不管他) 位置 0x55 0x13 希望得到的正確結果: 能成功指向struct的記憶體位置 有問題的code: (請善用置底文標色功能) #include "stdio.h" #include "stdlib.h" struct ms {int i;}; void main() { struct ms *pp = (struct ms*)malloc(sizeof(struct ms)); int *k = NULL; k = &pp } 程式跑出來的錯誤結果: k = &pp error C2440: '=' : 無法由 'ms **' 轉換為 'int *' *k = (int)pp 中斷,並顯示"並未將物件參考設定為物件的執行個體" k =(int)&pp k =(int&)pp error C2440: '=' : 無法由 'int' 轉換為 'int *' k =&(int)pp error C2102: '&' 需要左值 (l-value) 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) VS2005 檔案類型:Cpp 補充說明: 在舊版的C裡面 似乎可以直接回傳記憶體位置 或者是可以直接取得記憶體位置(無論宣告的type是否一樣) 也可以直接把memory address當int用 但現在似乎不行了 想請問一下 是否有其他的方法可以用 還是只能回去用比較老舊的編譯器?? 只是這樣又會出現其他難解的問題了 Orz -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 115.43.52.14 ※ 編輯: sosokill 來自: 115.43.52.14 (09/24 18:47)

09/24 18:51, , 1F
int *k = (int*)malloc(sizeof(int)); *k=(int)pp;
09/24 18:51, 1F

09/24 18:52, , 2F
簡單一點 int k = (int)pp; 也可以
09/24 18:52, 2F

09/24 18:53, , 3F
原po是想要指標的值喔 XDD
09/24 18:53, 3F

09/24 18:53, , 4F
咦 我誤會了嗎?
09/24 18:53, 4F

09/24 18:54, , 5F
int *ip = &(pp->i); 這樣最保險
09/24 18:54, 5F

09/24 18:54, , 6F
跟是不是舊版無關吧。你用的是C++編譯器,型態檢查嚴格是
09/24 18:54, 6F

09/24 18:54, , 7F
正常的 XD
09/24 18:54, 7F

09/24 18:55, , 8F
pp 本來就是指標了, 所以想辦法塞給 k 即可, 不用再加
09/24 18:55, 8F

09/24 18:55, , 9F
& 來取「指標變數」的位址, 另一個暴力法是 int *k =
09/24 18:55, 9F

09/24 18:56, , 10F
(int*)pp;
09/24 18:56, 10F
如果直接用 int *k = (int*)pp; 則會出現 error C2100: 不合法的間接取值

09/24 18:57, , 11F
int* k = reinterpret_cast<int*>(&pp);
09/24 18:57, 11F

09/24 18:57, , 12F
^ 不用這個
09/24 18:57, 12F
感謝nowar100 可以了~

09/24 18:58, , 13F
我用 gcc-4.5.1 編譯原po的程式會過 =w=
09/24 18:58, 13F

09/24 18:58, , 14F
跟舊版新版沒關係阿 C本來就是可以硬轉 C++不允許
09/24 18:58, 14F

09/24 18:59, , 15F
gcc會過 g++就不行了 XD
09/24 18:59, 15F

09/24 19:00, , 16F
其實vc只要把副檔名改成.c也會過
09/24 19:00, 16F

09/24 19:01, , 17F
註明自己在做什麼非常重要~~~
09/24 19:01, 17F
至於我要做什麼呢~主要是要修改smpl的模擬程式 一開始也是用C去compiler 但是始終會有兩個error出現 (詳細請看我的上一篇文章) 之後有板友告訴我 換成C++的編譯器試試看 就沒問題了 所以現在才會用C++來compiler 如果又改回.C 那又會陷入之前的問題 囧> ※ 編輯: sosokill 來自: 115.43.52.14 (09/24 19:14)

09/24 19:16, , 18F
傻眼...為了把錯誤消除去換一個編譯器, 這樣他們之間
09/24 19:16, 18F

09/24 19:17, , 19F
的差別要很清楚阿, 在 main 最前面寫一個函式去初始化
09/24 19:17, 19F

09/24 19:18, , 20F
你需要的所有全域變數不就好了? 其實跟你講 C++ 就是
09/24 19:18, 20F

09/24 19:18, , 21F
默默幫你做這件事情, 所以那個ERROR才會消失
09/24 19:18, 21F
該問題是出現在其他的檔案裡面 而不是出在我現在在修改的檔案 @.@ 那個檔案有點類似lib 就只是一些funcction 那裡要修改的話 可能會需要改一大堆地方... ※ 編輯: sosokill 來自: 115.43.52.14 (09/24 19:23)

09/24 19:23, , 22F
而且我覺得比起零零散散的用 = 賦值, 還不如分成幾個
09/24 19:23, 22F

09/24 19:23, , 23F
函式來集中管理
09/24 19:23, 23F

09/24 22:23, , 24F
.C跟 .c 是不一樣的, .C 是C++
09/24 22:23, 24F

09/25 00:49, , 25F
奉勸你不要這樣轉,可能會有重大災害發生。
09/25 00:49, 25F

09/25 00:53, , 26F
最糟糕的狀況,就是你後續對 *k 的存取完全被編譯器無視。
09/25 00:53, 26F

09/25 00:57, , 27F
咦 什麼狀況會發生樓上的「無視」呢?
09/25 00:57, 27F

09/25 01:27, , 28F
來聽講古 :)
09/25 01:27, 28F

09/25 10:45, , 29F
因為 struct ms * 和 int * 屬不同 type,C 標準說編譯器
09/25 10:45, 29F

09/25 10:45, , 30F
可以逕行把兩者視為沒有 aliasing 關係。
09/25 10:45, 30F

09/25 10:48, , 31F
原 po 的目的好像是 struct ms ** 換成 int *,問題差不多
09/25 10:48, 31F
文章代碼(AID): #1Cd86g5N (C_and_CPP)