2023年5月21日 星期日

C 語言指標相減後的型態為 long

今天在準備 C 語言教案時發現,  指標相減後的型態為長整數 long, 因此用 printf() 去輸出指標相減結果時若使用 %d 格式會出現 warning, 例如 : 

#include <stdio.h>

int main() {
     /* 宣告arr陣列和指定初值 */
    int arr[] = {0, 1, 2, 3, 4 }; 
    int *ptr1, *ptr2;  /* 宣告指向整數的指標變數ptr1, ptr1 */
    ptr1 = arr;    /* 將指標變數指向陣列第1個元素 */
    ptr2 = &arr[4];   /* 將指標變數指向陣列最後1個元素 */
    printf("ptr1~ptr2之間的元素數 = %d\n", ptr2-ptr1);    /* 印出兩指標差距 */
    return 0;
    }

此程式雖可正常執行, 但編譯時會出現如下 warning :

main.c: In function ‘main’:
main.c:18:38: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long int’ [-Wformat=]
   18 |     printf("ptr1~ptr2之間的元素數 = %d\n", ptr2-ptr1);    /* 印出兩指標差距 */
      |                                     ~^     ~~~~~~~~~
      |                                      |         |
      |                                      int       long int
      |                                     %ld
ptr1~ptr2之間的元素數 = 4

意思是指標相減的結果型態為 long int (常整數), 但我們卻使用整數 int 格式 %d 來顯示它, 如果想消除此礙眼的 warning, 可改用 %ld 格式 (注意是 long 的 L, 不是 123 的 1), 參考 :


改成如下後 warning 就不見了 :

#include <stdio.h>

int main() {
     /* 宣告arr陣列和指定初值 */
   int arr[] = {0, 1, 2, 3, 4 }; 
    int *ptr1, *ptr2;  /* 宣告指向整數的指標變數ptr1, ptr1 */
    ptr1 = arr;    /* 將指標變數指向陣列第1個元素 */
    ptr2 = &arr[4];   /* 將指標變數指向陣列最後1個元素 */
    printf("ptr1~ptr2之間的元素數 = %ld\n", ptr2-ptr1);    /* 印出兩指標差距 */
    return 0;
    }

或者用 (int) 將兩指標相減後的 long 型態強制轉型為 int 即可, 例如 :

#include <stdio.h>

int main() {
     /* 宣告arr陣列和指定初值 */
    int arr[] = {0, 1, 2, 3, 4 }; 
    int *ptr1, *ptr2;  /* 宣告指向整數的指標變數ptr1, ptr1 */
    ptr1 = arr;    /* 將指標變數指向陣列第1個元素 */
    ptr2 = &arr[4];   /* 將指標變數指向陣列最後1個元素 */
    printf("ptr1~ptr2之間的元素數 = %d\n", (int)(ptr2-ptr1));    /* 印出兩指標差距 */
    return 0;
    }

這樣使用 %d 格式就不會有 warning 了. 

沒有留言 :