我在教小弟弟C指针时遇到了这个问题。该代码的目的是使用gets()或scanf()读取一个简单的字符串,并给出给定字符串的前4个字符作为输出。

给出了两个版本的代码:

代码1:

    char *p;

    char *cptr;
    gets(p);
    cptr = p;
    printf("%c",*(cptr));
    printf("%c",*(++cptr));
    printf("%c",*(++cptr));
    printf("%c",*(++cptr));


代码2:

    char *p;
    int l=0;
    char *cptr;
    gets(p);
    cptr = p;
    printf("%c",*(cptr));
    while(l!=3)
    {
        printf("%c",*(++cptr));
        l++;
    }


如果我提供任何输入,则代码1给出正确的答案,而代码2给出分段错误。我找不到问题所在。为了确定,我尝试了长度大于4的输入。输入都是单个单词,因此不涉及空格。

所使用的编译器:GCC 4.4(ubuntu 14.04 64bit OS)

以上代码是否相同?如果是这样,为什么在代码2中给出seg.fault?请帮忙 。

最佳答案

   char *p;
   int l=0;
   char *cptr;
   gets(p);


在两个程序中均未初始化p指针,您正在将随机值传递给gets:它会调用未定义的行为。在某些情况下可能会起作用,而在其他情况下可能会崩溃。

当然,C中不推荐使用gets,应避免使用它。

08-17 05:45