我对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 } 发布于 2017-06-08 18:40:38
中的2
struct student record[2];不是最上面的索引,而是元素的数量。正如您所知道的,索引从零开始,这意味着对于上面的数组,有效的索引是0和1。越界会导致未定义的行为。
发布于 2017-06-08 18:40:22
struct student record[2];您有一个大小为2的数组,并且试图在其中存储3个元素。数组索引从0到n-1。record[2]是一个无效的索引。
发布于 2017-06-08 21:47:53
为了检查函数的完整性,返回语句Gcc旁边添加了保护变量(称为金丝雀),这些变量知道values.In的情况--当对record2执行未初始化的访问时,您违反了堆栈完整性,金丝雀值被覆盖,从而触发了崩溃。
https://stackoverflow.com/questions/44443277
复制相似问题