請注意下列二行程式碼有啥不同?
1. (__xdata unsigned char *)(icmp_data_rx+sizeof(struct icmp_hdr))
2. ((__xdata unsigned char *)icmp_data_rx)+sizeof(struct icmp_hdr)
3. (__xdata unsigned char *)icmp_data_rx+sizeof(struct icmp_hdr)
沒錯,就是括弧位置不同,但是請看下列編譯出來的組合碼。
../source/icmp.c:54: (__xdata unsigned char *)(icmp_data_rx+sizeof(struct icmp_hdr)),
mov dptr,#_icmp_data_rx
movx a,@dptr
mov r4,a
inc dptr
movx a,@dptr
mov r5,a
mov a,#0x40 ; 不同處
add a,r4
mov _memcpy_PARM_2,a
clr a
addc a,r5
../source/icmp.c:54: ((__xdata unsigned char *)icmp_data_rx)+sizeof(struct icmp_hdr),
mov dptr,#_icmp_data_rx
movx a,@dptr
mov r4,a
inc dptr
movx a,@dptr
mov r5,a
mov a,#0x08 ; 不同處
add a,r4
mov _memcpy_PARM_2,a
clr a
addc a,r5
注意到那不同處的地方了吧,二者算出來的值卻相差十萬八千里,其實在指標使用時,這是一個很容易犯錯的地方。當你原本只是要取一個結構結尾的指標,很自然的會寫出 1 的程式碼,但那是錯誤的。因為指標加法是根據指標的變數型態去相加,比如一個 short 指標加一,是指向下一個 short 位置,也就是指數加二。而在此案例上,第一種寫法是指向第8個結構的位置,也就 8x8=64=0x40 的位置,實在是大錯特錯。正確寫法為第2,3個寫法。