当前位置: 技术问答>linux和unix
这个程序崩溃的原因?
来源: 互联网 发布时间:2016-04-01
本文导语: 1 #include 2 #include 3 #include 4 typedef struct TAG_datastruct 5 { 6 char* string; 7 int checksum; 8 }datastruct; ...
1 #include
2 #include
3 #include
4 typedef struct TAG_datastruct
5 {
6 char* string;
7 int checksum;
8 }datastruct;
9
10
11 datastruct* getinput( void );
12 void printmessage(datastruct* todisp);
13 int main()
14 {
15 int counter ;
16 int maxval = 0;
17 datastruct* svalues[200];
18 for ( counter =0 ; counter string = strdup(input); /*char *strdup(const char *s);*/
41 instruct->checksum = 0;
42 for ( counter = 0 ; counter string); counter++ )
43 {
44 instruct->checksum += instruct->string[counter];
45 }
46 return instruct ;
47 }
48
49 void printmessage(datastruct* todisp )
50 {
51 printf(" This structure has a checksum of %d . Its string is : n ", todisp->checksum);
52 puts(todisp->string);
53 }
54
当我直接输入:Enter的时候就有如下下的错误
段错误 (core dumped)
用gdb调试的结果是:
Core was generated by `./test4_4'.
Program terminated with signal 11, Segmentation fault.
#0 0x080485bf in printmessage (todisp=0x0) at test4_4.c:51
51 printf(" This structure has a checksum of %d . Its string is : n ", todisp->checksum);
其栈中的内容是:
(gdb) bt
#0 0x080485bf in printmessage (todisp=0x0) at test4_4.c:51
#1 0x080484d4 in main () at test4_4.c:25
(gdb) frame 1
#1 0x080484d4 in main () at test4_4.c:25
25 printmessage( svalues[maxval/2] );
意思就是在maxval有错误了,但是错误的原因是什么,我想有个具体的解答!
|
刚才弄错了,36行到38行没问题。
如果第一次输入的时候就直接输入Enter,getinput返回NULL,执行到25行的时候maxval是0,svalues[0]是NULL,所以52行的todisp也是NULL,于是崩溃了。
如果第一次输入的时候就直接输入Enter,getinput返回NULL,执行到25行的时候maxval是0,svalues[0]是NULL,所以52行的todisp也是NULL,于是崩溃了。
|
顺便说一句,对于这种有指针作为参数的函数,要特别小心,应该在使用这个指针之前,判断是否NULL。
49 void printmessage(datastruct* todisp )
50 {
51 printf(" This structure has a checksum of %d . Its string is : n ", todisp->checksum);
52 puts(todisp->string); // 事先判断todisp是否NULL
53 }
|
gdb已经告诉你了:
#0 0x080485bf in printmessage (todisp=0x0) at test4_4.c:51
todisp是个空指针!
#0 0x080485bf in printmessage (todisp=0x0) at test4_4.c:51
todisp是个空指针!