如題
宣告一個字元陣列,其中索引值的大小不是決定自數的多寡,我將char a[]陣列設為4執行後我輸入大於4的名字,但卻不會出錯,請問這是為什麼
对数组 subject[4] 越界访问,而scanf() 函数读取时不检查边界,这属于未定义行为,你输入三次正常,运气好而已,多试几次会崩溃。scanf("%s", &subject); 这写法有误,输入是字符串,参数前的 ‘&’ 符号应取消,应为: scanf("%s", subject);
因为c语言不会对数组越界做出检查,需要程序员自己保证不越界
越界后如果不侵犯到不可写的内存,程序不会崩溃,侵犯到别的变量,程序会出现奇怪的运行结果,因为别的变量被改变了。 如果只越界一点点,那么也可能什么不会发生。
【以下回答由 ChatGPT 生成】
这个现象是由于C语言对于数组的访问没有进行越界检查,导致当你输入超过设定大小的字符时,程序没有报错并继续执行。
在C语言中,数组名相当于数组的首地址,通过索引来访问数组元素。当你定义了一个字符数组char a[i]时,这个数组会在内存中分配一段连续的空间,可以容纳i个字符。
然而,C语言并没有对数组访问进行越界检查。当你通过索引访问数组元素时,实际上是访问了相应位置的内存空间。如果这个内存空间是可读可写的,你就可以读取或者修改其中的数据。如果这个内存空间不属于你的程序,或者已经被其他变量占用,那么你访问的数据可能是不确定的,可能会导致程序出现错误,但是C语言不会主动抛出异常或者报错。
要解决这个问题,你可以在程序中添加越界检查,确保你的程序不会访问超出数组范围的索引。以下是一个简单的例子:
#include <stdio.h>
int main() {
int i = 4;
char a[i];
for (int j = 0; j < i; j++) {
printf("请输入第%d个字符:", j+1);
scanf("%c", &a[j]);
getchar(); // 消耗掉输入缓冲区中的换行符
}
for (int j = 0; j < i; j++) {
printf("第%d个字符是:%c\n", j+1, a[j]);
}
return 0;
}
在这个例子中,我们使用一个循环来逐个接收字符输入并存入数组a中。循环的次数等于数组的大小i。这样就确保了输入的字符数量不会超过数组大小。如果你尝试输入超过4个字符,程序将只接受前4个字符,并将它们存入数组,后面的字符将被忽略。你可以根据实际情况修改数组大小和逻辑处理。
【相关推荐】