当前位置:首页 » 编程语言 » c语言数组越界解决办法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言数组越界解决办法

发布时间: 2023-01-07 02:34:03

‘壹’ 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吸收一下换行符就好啦