我是C的新手,而且我发现gcc的特殊输出让我很难找到底线。运行应用程序时出错:
*** stack smashing detected ***: /home/joshua/Research/cml/test terminated
Program received signal SIGABRT, Aborted.
0x00007ffff7a43428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
我已经对此进行了一些研究,例如,这似乎是因为将一个过大的值放入数组中而引起的。我没有做那样的事情。
以下是我的示例代码供参考:
1 #include <stdio.h>
2 #include <string.h>
3
4 struct student
5 {
6 int id;
7 char name[10];
8 float percentage;
9 };
10
11 int main()
12 {
13 int i;
14 struct student record[2];
15
16 // 1st student's record
17 record[0].id=1;
18 strcpy(record[0].name, "Raju");
19 record[0].percentage = 86.5;
20
21 // 2nd student's record
22 record[1].id=2;
23 strcpy(record[1].name, "Surendren");
24 record[1].percentage = 90.5;
25
26 // 3rd student's record
27 record[2].id=3;
28 strcpy(record[2].name, "Thiyagu");
29 record[2].percentage = 81.5;
30
31 for(i=0; i<3; i++)
32 {
33 printf(" Records of STUDENT : %d \n", i+1);
34 printf(" Id is: %d \n", record[i].id);
35 printf(" Name is: %s \n", record[i].name);
36 printf(" Percentage is: %f\n\n",record[i].percentage);
37 }
38 return 0;
39 }
答案 0 :(得分:5)
中的
2
struct student record[2];
不是顶级索引,它是元素的数量。并且您似乎知道索引从零开始,这意味着上述数组的有效索引为0
和1
。超出界限会导致未定义的行为。
答案 1 :(得分:2)
struct student record[2];
您有一个2号数组,并且您正试图在其中存储3个元素。数组索引从0到n-1。 record[2]
是无效索引。
答案 2 :(得分:-1)
为了检查函数的完整性,在return语句旁边,Gcc添加了具有已知值的保护变量(称为canaries)。在你的情况下,当你在记录[2]上完成未初始化的访问时,你违反了堆栈完整性和覆盖的金丝雀值会触发崩溃。