看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) DevC++ 問題(Question): 在不用memcpy的情況下, 我想把整數x的內容設給字元陣列y. 目前的想法是直接把x的位置設給y,但編譯時會出現以下error. incompatible types in assignment of `char*' to `char[4]' 還有什麼辦法可以把x的值設給y嗎? 感謝. 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <string.h> int main() { int x = 0x55555555; char y[4]; y = (char *)&x; return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.233.74.51 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1439913312.A.D27.html ※ 編輯: nimura14 (118.233.74.51), 08/18/2015 23:55:42
dritchie: *((int*)&y)=x; 08/18 23:59
感謝回覆! ^^ y是指向該陣列的頭的位置對吧? 再取址的意義是什麼呢?
nimura14: 可以耶...為什麼呢? 08/19 00:06
nimura14: 我試過用*y = x;也可以, 可是不懂為什麼. 08/19 00:07
※ 編輯: nimura14 (118.233.74.51), 08/19/2015 00:15:59
stupid0319: *(int*)y = x ; 08/19 00:17
stupid0319: y[0] = 0xFF & x ; y[1] = 0xFF00 & x ; 08/19 00:21
stupid0319: y[2] = 0xFF0000 & x ; y[3] = 0xFF000000 & x; 08/19 00:22
stupid0319: 寫錯了,應該用>>操作,練習看看吧 08/19 00:24
stupid0319: 用union也可以,方法一大堆 08/19 00:27
nimura14: 謝謝回覆!! 08/19 00:30
EdisonX: 這種操作要注意的應該是 big/little endian 08/19 00:36
dritchie: y與&y雖然知道的位置一樣 但type不同 我為了轉型較合理 08/19 00:37
EdisonX: 上面兩種方法在 little endian 情況下都是反的 08/19 00:37
感謝deitchie, 我會研究看看, 真的學習了! 剛剛看了一下...第一次知道這個事實.... y的type是char * &y的type是char *[4] y和&y雖然位置一樣, 但是做記憶體運算時結果可是大不同...謝謝指教了!感謝 感謝EdisonX, 謝謝提醒!! 感謝stupid0319提供的1 byte 1byte搬的方式~~ ※ 編輯: nimura14 (118.233.74.51), 08/19/2015 00:45:12
AIGecko: 假如編譯器是GCC的話可以用個神奇的指令做位元反轉 08/19 00:58
AIGecko: *((int*)&y)=__builtin_bswap32(x); 08/19 00:58
AIGecko: 舊版的不確定是否有該內建指令就是了 08/19 00:59
※ 編輯: nimura14 (118.233.74.51), 08/19/2015 01:05:24
nimura14: 謝謝喔!我會去看看GCC的__builtin_bswap32() 08/19 01:07
剛剛還試過以下2個方式,結果都正確, 但是觀念怪怪的 1. y[0]=x; 直接把整數x的value設給字元陣列的第一個元素. 這個方式我覺得最怪,整數是4byte, 字元是1byte, 這樣的assign方式不會溢位嗎? 2. *y = x ; 這個方式沒有做牆制型態轉換, 但結果也是對的, 編譯器也沒warning. 是因為編譯器自己幫我做了型態轉換嗎? ※ 編輯: nimura14 (118.233.74.51), 08/19/2015 01:08:15
EdisonX: 1.int 轉成 char 存到 y[0] 2. array dereference,未定義 08/19 01:55
cobrasgo: 2沒有warning嗎?回家試試 08/19 19:11
TobyH4cker: 兩個都是沒問題的唷 08/21 02:26
TobyH4cker: 1跟2都做了轉型為char再寫到陣列第一個元素的位置 08/21 02:27
TobyH4cker: 如果eax現在是0x00656463,那這兩行做的都是mov byte 08/21 02:30
TobyH4cker: ptr [ebp-4], al,al是eax的 08/21 02:30
TobyH4cker: 最低byte,也就是這裡的0x63 08/21 02:31