『壹』 c語言數組越界問題
數組越界已經發生了,只是沒有立刻提示出來而已
這就是越界的後果
ISO
C說這種代碼「行為是未定義的」(the
behavior
is
undefined),也就是說任何後果都是合理的,包括編譯時報錯、運行時出錯、看似正常的運行……
『貳』 C語言數組越界問題
對於數組而言,大部分語言中,數組的下標都是從0開始的,因此:
定義 int a[9]; 則,其最大下標為8(0,1,2, 3,4,5, 6,7,8)
所以,上面代碼肯定會越界,因為 最大時,下標為9了
『叄』 關於C語言一維數組越界
#include <stdio.h>
#include<string.h>
#define N 4
main()
{
char a[N],i=0,len,j,t; //a[N]是a[4]數據共4個元素:a[0],a[1],a[2],a[3](下標從0開始)。
for(;i<N;i++) // i < 5,最大為N,將5改為N
{
printf("請輸入一個5位數:");
scanf_s("%c",&a[i]); // 當i為4時,,出錯
}
len=strlen(a);
if(len==N) //5改為N
{
j=N;
for(i=0;i<N;i++)
{
t=a[i];
a[i]=a[j];
a[j]=t;
j--;
}
}
else
printf("你輸入的數不是4位數。"); //如果你想弄成5位數,直接將N改為5: #define N 5
}
『肆』 C語言二維數組與越界的問題
對於數組a[M][N],其索引范圍是a[0][0]~a[M - 1][N - 1],所以循環變數取值i = 1;i <= M和j = 1; j <=N是錯誤的,應該改為i = 0; i < M和j = 0. j < N;。這就是你代碼出現越界錯誤的根源。另外,if(i = 1 != 0 &&...也是錯誤的,應該改為if(i == 1 $$ i != 0 && ...),(這里的$$ 應根據你的具體需要替換為&&或||)。
『伍』 C語言數組越界
#include"stdio.h"
#include"string.h"
int equal(char* p_c,char c)
{
int a = strlen(p_c);
for(int i = 0;i < a;i++)
{
if(*(p_c + i) == c)
{
return 1;
}
}
return 0;
}
void Union(char* p_c1,char* p_c2)
{
char* p = p_c1;
int a = strlen(p_c1);
int b = strlen(p_c2);
p_c1 = p_c1 + a;
while((*p_c2) != '\0')
{
char temp = *p_c2;
if(equal(p,temp));
else
{
*p_c1 = *p_c2;
p_c1++;
}
p_c2++;
}
*p_c2='\0';
}
void main()
{
char a[100] = "maxuefeng";
puts(a);
char b[20] = "dingfangjie";
puts(b);
Union(a,b);
puts(a);
}
如上,在你的union函數中加個
*p_c2='\0';
這樣才算是字元串合並了。
應該用較大的數組,你要確定合並後的長度小於數組長度,這樣它才可以運行,輸出,否則,就會越界,例如a[10],就不行,因為長度太小了,合並後a[10]放不下字元串。
『陸』 c語言數組越界
因為,內存的分配是從高地址到低地址進行的,但一個數組內部元素又是從低到高進行的,所以:
語句序列
int i=0; int a[]={10,30};
的內存分配情況是(地址:低--高):
a[0] a[1] i
而語句序列
int a[]={10,30}; int i=0;
的內存分配情況是(地址:低--高):
i a[0] a[1]
所以,前者越界影響到了i,而後者越界沒有影響到i。
『柒』 怎麼解決數組越界的問題
1、什麼是數組訪問越界?
我們通過數組的下標來得到數組內指定索引的元素。這稱作對數組的訪問。
如果一個數組定義為有n個元素,那麼,對這n個元素(下標為0 到
n-1的元素)的訪問都合法,如果對這n個元素之外的訪問,就是非法的,稱為「越界。
數組佔用了一段連續的內存空間。然後,我們可以通過指定數組下標來訪問這塊內存里的不同位置。因此,當你的下標過大時,訪問到的內存,就不再是這個數組「份內」的內存。你訪問的,將是其它變數的內存了。
2、訪問越界會出現什麼結果?
首先,它並不會造成編譯錯誤!就是說,C,C++的編譯器並不判斷和指出你的代碼「訪問越界」了。一個明明是錯誤的東西,就這樣「順利」地通過了編譯。數組訪問越界在運行時,它的表現是不定的,有時似乎什麼事也沒有,程序一直運行(當然,某些錯誤結果已造成);有時,則是程序一下子崩潰。因此在使用數組時,一定要在編程中判斷是否越界以保證程序的正確性。
常見的錯誤就是數組的size值和下標訪問值弄錯,數組的下表是從0開始的,最大的訪問值是size-1。
3、解決辦法
由於數組的元素個數默認情況下是不作為實參內容傳入調用函數的,因此會帶來數組訪問越界的相關問題,解決問題方法,可以用傳遞數組元素個數的方法即:用兩個實參,一個是數組名,一個是數組的長度。
舉例:
#include<stdio.h>
void PutArray(int *p, int length)
{
// 在此判斷入口參數p和length的有效性
……
for(int
i=0;i<length;i++)
printf("%d\t",p[i]);
}
void main()
{
int a[3]={2,4,6} ;
printf("數組a[3]調用函數PutArray的結果為:\n");
PutArray(a,
sizeof(a)/sizeof(a[0]));
}
『捌』 C語言數組越界問題
二維數組定義的一般形式為:類型說明符 數組名 [常量表達式][常量表達式]
這兩個常量表達式分別指定了二維數組的行數和列數,程序編譯時據此向內存申請空間。
而引用二維數組的格式為: 數組名[行下標][列下標],行下標和列下標都是從0開始排序。這里的下標和上面的常量表達式意義不同,范圍也不同。
例如:
int b[4][5]是定義一個名為b的二維數組,它包含4行5列,共20個元素。如果存放數組b的首地址為p,則內存為數組分配的空間是p~p+19;數組b的行下標范圍為0~3,列下標范圍為0~4,地址p+19存放的元素為b[3][4]。如果要引用b[4][5],由於沒有提前向內存申請地址,則會隨機指向一個地址,得到一個垃圾數據,無法實現我們的目的,就說是引用下標越界。
『玖』 c語言數組越界怎麼處理vc6.0
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,n;
printf("The number of country is:");
scanf("%d",&n);
char a[100][100],max[100];
printf("Your country name:\n");
getchar();
for(i=0;i<n;i++)
gets(a[i]);
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
if(strcmp(a[j],a[j+1])>0)
{
strcpy(max,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],max);
}
}
for(i=0;i<n+1;i++)
{
puts(a[i]);
}
return 0;
}
你的程序寫的不錯,不是數組越界而是換行符干擾,加一個getchar吸收一下換行符就好啦