C printf导致getlogin()出现segfault

C printf导致getlogin()出现segfault,c,segmentation-fault,printf,C,Segmentation Fault,Printf,我是C新手,所以如果答案显而易见,我道歉,我已经在别处搜索过了 我要介绍的图书馆包括: #include <unistd.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/wait.h> #include <fcntl.h> #include <sys/stat.h> cry不会打印,所以这意味着getlog

我是C新手,所以如果答案显而易见,我道歉,我已经在别处搜索过了

我要介绍的图书馆包括:

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h> 
#include <fcntl.h>
#include <sys/stat.h>
cry不会打印,所以这意味着getlogin成功。SEGF故障是由printf(用户)引起的

进一步测试表明,滤光块完全可以打印

    printf("this prints\n");
    printf(USER);
    printf("this prints\n");
但触发块将打印此打印结束,然后segfault,而不显示用户

    printf("this prints\n");
    printf(USER);
编辑:

对不起,浪费了你的时间。我不小心删除了一个应该跟随它的fgets,这导致了SEGFULT。我已经在这个问题上呆了几个小时了,我喜欢这个问题这么小的时候


谢谢

您应该检查getcwd返回值。根据getcwd手册页:

如果当前工作的绝对路径名的长度 目录(包括终止的空字节)超过大小字节, 返回NULL,errno设置为ERANGE;申请应 检查此错误,必要时分配更大的缓冲区


如果
USER
为空,
printf
将取消对空指针的引用,这是未定义的行为。当出现未定义的行为时,编译器不需要做一些有意义的事情,所以当用户为null时,它可以不打印“cry”。您将希望避免未定义的行为


可能导致您的结果的另一个原因是发送到标准输出的数据通常是缓冲的。如果程序在数据从缓冲区刷新之前崩溃,数据将丢失而不是打印。

下面是printf的工作原理

  • 它必须读取格式字符串
  • 它必须从堆栈中获取值,以便实现格式说明符、格式化它们并输出它们
  • 可能导致这种情况的例子

    char stringOfTest[5] = {'1','2','3','4','5'};
    

    因此,第一个可能会崩溃,因为字符串不是以null结尾的,根据应用程序的状态,它基本上可以读取,直到溢出缓冲区为止(一个好的实现应该防止这种情况),或者恰好遇到导致崩溃的格式说明符。。。这也适用于任何垃圾数据

    第二个是关于变量函数是如何工作的。。。所有变量都按一定顺序推送到堆栈上,函数无法安全地知道最后一个是哪一个。。。因此,它将继续抓取指定的内容,直到从堆栈中抓取某些内容并(可能)崩溃


    第三种方法也在第二个例子中。。。如果您有一个%s,它将导致一个指针被取消引用。。。因此,它也可能崩溃。

    可能正在打印
    cry
    ,但它没有足够的时间来区分故障。如果未输入块,则在此处添加断点(或其他内容)以验证
    。尝试添加:else printf(“%s\n”,USER);如果我将printf(CWD)放在printf之前(“%s@myshell:%s>”,用户,CWD);我编辑了我的cvode,以更清楚地表达它失败的地方将你的解决方案作为答案,并接受它以结束这篇文章。如果我将打印(CWD)放在printf之前(“%s@myshell:%s>,用户,CWD),但printf(“%s@myshell:%s>”,用户,CWD);will print路径并没有那么大,但我将CWD的大小增加到1024以确保它仍然失败。
    
    char stringOfTest[5] = {'1','2','3','4','5'};
    
    char * stringOfTest = "here are some formats that will be unsatisfied: %d%f%i%s%x";