當指標遇上結構

Posted by: 邱小新 at 上午10:50 in ,

請注意下列二行程式碼有啥不同?

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個寫法。

0 意見

張貼留言