我在看《明解C语言》这本书是发现了一个很有意思的代码,当我正在重复上述代码时发现了这个错误,我认为是我在模仿这个代码是中途出了问题,直到我核对一遍遍之后,发现并没有什么太大的差距。
以下是出错代码
//输入一个学生表(序号+姓名)
//并输出一个及格表
#include<stdio.h>
#define n 2
int main()
{
int arr[] = { 0 };//存放学生成绩
int arr1[] = { 0 };//存放及格成绩
int sum = 0;//作为及格人数的下标
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d号:",i+1);
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i++)
{
if(arr[i]>= 60)
{
arr1[sum] = i;
sum++;
}
}
for (i = 0; i < sum; i++)
{
printf("%d号 %d ", arr1[i] + 1, arr[arr1[i]]);
}
return 0;
}
于是我陷入了沉思,看到Stack around the variable ‘arr’ was corrupted.这句报错是他说正在从数组中读取无效值,我刚开始认为是scanf没有正常读入数据,经过我编译后,并不是这样的。翻译错误后才明白,这句话的意思是某变量周围的堆栈区被破坏,问题的根本原因就是没有明确指出数组大小,这个时候计算机自动识别并分配存储空间,要对两个数组进行拼接,就导致先开辟的空间不够用,所以会就会破坏原变量周围的堆栈区。
经过检查我确实没有定义数组的大小,只是初始化,当我定义了数组大小后,发现代码能正常运作。
//输入一个学生表(序号+姓名)
//并输出一个及格表
#include<stdio.h>
#define n 2
int main()
{
int arr[n] = { 0 };//存放学生成绩
int arr1[n] = { 0 };//存放及格成绩
int sum = 0;//作为及格人数的下标
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d号:",i+1);
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i++)
{
if(arr[i]>= 60)
{
arr1[sum] = i;
sum++;
}
}
for (i = 0; i < sum; i++)
{
printf("%d号 %d ", arr1[i] + 1, arr[arr1[i]]);
}
return 0;
}
经过我浏览其他人的问题发现,不止数组会出现这种状况,字符串也会出现。
这是《明解C语言》原书的代码,比我实际写出要更简洁一些: