1. 程式人生 > >C語言遇到的陣列溢位問題

C語言遇到的陣列溢位問題

今天寫了個判斷陣列中資料的最大值問題的程式碼,發現了一個有趣的情況,陣列溢位值總是一個;

現附上今天寫的判斷陣列最大值的程式碼:

#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;
}

其溢位值都為 ?  (注:字元型陣列需要用“ ” 雙引號,而不是大括號)。