- 论坛徽章:
- 0
|
本帖最后由 dacaisha 于 2010-12-07 11:27 编辑
各位高手大家好:
近日,我在red hat linux中用C编写了一段程序,代码如下:
#include<stdio.h>
#include<string.h>
main()
{
char *p[3]={"how","are","you"};
char *a[3];
int i,j,k;
for(i=0;i<3;i++)
{
printf("Input a comparable string\n");
gets(a); /*输入比较字符串*/
}
for(i=0;i<3;i++)
{
if((j=strcmp(p,a))==0) k++;
}
if(k==3) printf("Correct!!\n"); /*字符串都相等*/
else printf("Incorrect!!\n");
}
用gcc生成可执行文件后,运行会出现错误。用gdb调试时发现:在比较p[0]与a[0]、p[1]与a[1]时,程序都正常。但是比较p[2]和a[2]时,错误提示p[2]地址超出有效范围。我们在刚开始的时候已经对*p[]进行了初始化了,为什么还会出现这个错误提示呢??而且p[0]、p[1]运行完后的地址都与初始化的地址一样,为什么只有P[2]的地址变化了,而且还超出有效范围呢??
-----------------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------------------------
为了进一步研究这个问题,我又写了一下代码:
1 #include<stdio.h>
2 #include<string.h>
3 main()
4 {
5
6 int y;
7 char *p="hello";
8 char *a;
9 gets(a); /*输入字符串*/
10 y=strcmp(p,a);
11 printf("%d",y);
12
13
14 }
此时运行程序,会出现Program received signal SIGSEGV, Segmentation fault.
但是用gdb调试时,程序却能通过。调试步骤如下:
(gdb) b 10
(gdb) r
(gdb) s
(gdb) s
(gdb) c
结果是:0, program exited with code 01.
为什么调试能通过,但是在终端中运行却通不过呢,而且在gdb中,直接run的话也是出现相同的错误提示。
还望各路高手多多指点啊!!!!!! |
|