c - 使用 while 循环的简单程序出现段错误,但扩展时没有错误。如何?

标签 c string pointers gcc

我在向我弟弟教 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 64位操作系统)

上面的代码不是一样吗?如果是这样,为什么它在代码 2 中给出 seg.fault ?请帮忙 。

最佳答案

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

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

当然,gets 在 C 中已被弃用,应避免使用。

关于c - 使用 while 循环的简单程序出现段错误,但扩展时没有错误。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27183102/

相关文章:

c++ - c++的数组和指针作业

c - 使用共享内存平铺技术在 CUDA 中进行矩阵相乘

python - 适本地分割字符串(使用reg.exp.)以提取Python中的一些信息

c++ - 复制文件错误代码 2

arrays - 匹配 shell 中的单词后分割字符串

java - 如何使用Java正则表达式匹配既不包含A也不包含B的字符串?

c++ - 用于保存对对象的前向引用的智能指针

c - 当影响 int 的值时明显出现段错误

c++ - 错误 : Label used but not defined when using && operator

c - 我应该减少设置变量吗