当前位置:首页 » 编程语言 » C语言数组没有边界限定
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

C语言数组没有边界限定

发布时间: 2022-08-10 16:22:48

‘壹’ c语言中,数组定义时下标有范围限定吗

理论上是没有的,我们一般也不会定义特别大,至于会不会因为定义得特别大而超出计算机内存,我没有试过,不知道~

‘贰’ C语言数组,我没有越界啊,怎么这样help!

int x[2]; // x包含2个元素 x[0] x[1]
x[2] = getchar(); // 没有x[2] 此处越界了

‘叁’ C语言数组问题

你的描述:给出首地址,按照顺序一直存下去

C语言室不检查数组边界的
这就是c的特点:短小,速度快,把自由度全部给程序员。

其实如果对数组边界进行检查的语言多的是,你如果需要可以换一个语言。
《陷阱》书上把c比喻成“菜刀”(见过2、3本比喻成“刀”),问你如果为了避免切到自己的手,会否加上一个保护装置?

‘肆’ c语言问题,请求解答

char[5]在定义时是分配了5个字节的地址。这5个后面是存别的变量的地址,也可能没有被分配走,是个无用的地址。输入的超过5个后,就会连着存在后面的地址里。输出时,只是给出字符串的首地址,输到'\0'之前就结束。char[5]里面输出后,再到 char[6] 里面就是超出的 '\0'
有时会有问题,是因为,后面那个地址里值,被别的地方改掉了,不是'\0' 它就会一直连着输出。直到后面某一个地址里遇到 '\0'才会停。

‘伍’ 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语言指针问题

你要透彻理解这里的问题,需要理解数组,指针以及数组与指针的关系。你可以找本C语言的书好好看看,我先帮你分析下这里的问题。

int *p[4];
声明了一个数组,数组有4个元素,每个元素的类型是int指针。
即p可以保存4个int指针,即p[0],p[1],p[2],p[3]都是指针。

#include"stdio.h"
main()
{
int x[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},*p[4],i;
for(i=0;i<4;i++)
{
p[i]=&x[2*i+1]; /* 将x[2*i+1]的地址分别存储p[i] */
/* 四次循环后p[0] p[1] p[2] p[3]分别为x[1] x[3] x[5] x[7]的地址 */
/* 也就是*p[0] *p[1] *p[2] *p[3] 的值为2,4,6,8 (x[1] x[3] x[5] x[7])*/
printf("%d",p[i][0]);/* 这里数组和指针的转换,数组的本质也是指针 */
/* p[i]是指针,也可以看成是一个4*1的二维数即 *(p[i]+0) 等价于 p[i][0] */
/* *(p[i]+0) 去掉0 即 *p[i] 所以答案很明显 */
}
printf("\n");
}

第二题
#include"stdio.h"
main()
{
int x[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},*p[4],i;
for(i=0;i<4;i++)
{
p[i]=&x[2*i+1];/* 这之前与上一题相同 */
printf("%d",p[0][i]);
/* p可以看成是一个1*4(上题是4*1)的二维数即 *(p[0]+i) 等价于 p[0][i] */
/* 所以是p[0]地址即其后的连续4个地址 所以输出 2,3,4,5 */
/* 而上题输出的四个值的地址是不连续的,分别是x[1] x[3] x[5] x[7]的地址*/
}
printf("\n");
}

你需要找本书看看数组的本质,其实C语言从语法来说是没有二维数组的,如int p[i][j]其实是一个有i个元素的数组,而每个元素中又含有j个int类型元素的数组。其本质是数组的数组,而不是二维数组。

PS: 上面4*1和1*4中维数是假设你可以看成是任何维数的数组,因为C语言中的数组是没有边界的,超出边界只会引起非法内存访问,而不会引起语法错误。
这里的假设都是合法的假设,用于说明问题

‘柒’ C语言为什么不执行数组边界的有效性检查

没有对指针类型的数据进行访问区域的约束。
这种约束没有什么必要,而且实现起来比较麻烦,类似于内存的权限管理,一般更加复杂的系统比如操作系统才进行这样的决策处理。

‘捌’ c语言字符串数组

字符串是连续的字符序列,最后以空字符'\0'作为终止符。一个字符串的长度指所有字符的数量,但不包括终止符。在 C 语言中,没有字符串类型,自然也就没有运算符以字符串为操作数。

字符串被存储在元素类型为 char 或宽字符类型数组中(宽字符类型指 wchar_t、char16_t 或 char32_t)。宽字符组成的字符串也称为宽字符串(wide string)。

C 标准库提供了大量的函数,它们可以对字符串进行基本操作,例如字符串的比较、复制和连接等。在这些传统的字符串函数以外,C11 新增了这些函数的“安全”版本,它们能确保字符串操作不会超出数组的边界。

可以使用字符串字面量来初始化任何字符类型数组。

‘玖’ C语言声明数组必须要设定范围

知道错 你知道为什么>>>??????????

int num[i][j] 首先编译程序告诉你 没有声明的两个变量
i j对吧 程序不对 所以 它不能这样写

还有i j就算定义了 没值 不确定句不能确定num数组的大小
计算机很苯的 就认为它很大 那这么办 就是无限的大啊
向内存申请了 很大很大的空间 然后四机了

也说明 不能这样写

其实在书上已经写的很明白了 数组的声明可以怎么样
不可以怎么样 我只是 反向的解释下
希望有帮助