#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 了.
沒有留言:
張貼留言