C語言遇到的陣列溢位問題
阿新 • • 發佈:2018-12-18
今天寫了個判斷陣列中資料的最大值問題的程式碼,發現了一個有趣的情況,陣列溢位值總是一個;
現附上今天寫的判斷陣列最大值的程式碼:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() { int arr[10] = {100,59,3,266,45,77,182,99,55,15}; int max_num = 0; int i = 0; for (i = 0; i < sizeof(arr) / sizeof(int); i++) { if (max_num < arr[i]) { max_num = arr[i]; } } printf("最大值為:%d\n",max_num); system("pause"); return 0; }
問題發現是這樣的,之前在for迴圈之外還寫了個while迴圈進行判定(不知道怎麼想的,寫了個while迴圈),大概就是這:
while (arr[i]) {
for (i = 0; i < sizeof(arr) / sizeof(int); i++) {
if (max_num < arr[i]) {
max_num = arr[i];
}
}
}
本來想的是arr[i]的i值取值超過資料限定,當前arr[i]值應該為NULL(這是錯誤的猜想);結果發現沒有輸出值了,單步後發現arr[i]的溢位值為一個常數,不為空,進入了while死迴圈。
就如上所說,這個溢位值是-858993460,給了兩個陣列結果還是一樣。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() { int arr[20] = { 100,59,3,266,45,77,182,99,55,15,50 }; int arr1[100] = {77,88,99,101,205,303,459,16516516,1151651615,115151,15616,151689849,213,50}; int i = 0; int j = 0; for (i = 0; i < sizeof(arr) / sizeof(int); i++); for (j = 0; j < sizeof(arr1) / sizeof(int); j++); printf("%d\n", arr[i]); printf("%d\n", arr1[j]); system("pause"); return 0; }
經過查閱知道,當你的陣列溢位時,VS會自動給你的變數進行賦值操作,而我的這個是int型變數,系統自動賦值為-858993460,並不存在什麼溢位即為空的猜想。
另外給出的char型變數進行的溢位判斷如下
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
//int arr[20] = { 100,59,3,266,45,77,182,99,55,15,50 };
//int arr1[100] = {77,88,99,101,205,303,459,16516516,1151651615,115151,15616,151689849,213,50};
char arr[20] = "a,b,f,g,s,t,y";
char arr1[100] = "d,k,l,y,r,s";
int i = 0;
int j = 0;
for (i = 0; i < sizeof(arr) / sizeof(char); i++);
for (j = 0; j < sizeof(arr1) / sizeof(char); j++);
printf("%c\n", arr[i]);
printf("%c\n", arr1[j]);
system("pause");
return 0;
}
其溢位值都為 ? (注:字元型陣列需要用“ ” 雙引號,而不是大括號)。