我是C的新手,所以如果答案很明显,我深表歉意,我在其他地方搜索了。
我包括的库是:
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/stat.h>
失败的代码是:
char *USER = getlogin();
char CWD[128];
if (USER == NULL)
printf("cryn");
getcwd(CWD, sizeof(CWD));
printf("this printsn");
printf(USER);
printf("this does notn");
printf("%s@myshell:%s> ", USER, CWD);
cry不会打印,因此应该意味着GetLogin成功。segfault是在printf(用户);
上引起的进一步的测试表明,Folling Block完全打印
printf("this printsn");
printf(USER);
printf("this printsn");
但是,folling块将打印此打印末端,然后segfault而不显示用户
printf("this printsn");
printf(USER);
编辑:
对不起,浪费了时间。我不小心删除了应该跟随它的fget,这导致了segfault。我已经在这个错误上了几个小时,当问题很小时,我喜欢它。
谢谢
您应该检查getCWD返回值。根据getCWD的人页:
如果当前工作的绝对路径名的长度 目录,包括终止null字节,超过大小字节, null返回,Errno设置为Erange;申请应 检查此错误,并在必要时分配较大的缓冲区。
如果 USER
为null,则printf
将取消一个无定义的行为。编译器不需要执行不确定的行为时有意义的事情,因此当用户为null时,允许不打印"哭泣"。您需要避免不确定的行为。
可能导致您结果的其他可能是发送到STDOUT的数据通常被缓冲。如果程序在数据从缓冲区冲洗之前崩溃,则数据将丢失而不是打印。
所以这是printf的工作方式...
- 它必须以格式字符串读取。
- 它必须从堆栈中获取值,以实现格式指定器,格式化并输出它们。
可能导致此的事物的示例...
char stringOfTest[5] = {'1','2','3','4','5'};
或
char * stringOfTest = "here are some formats that will be unsatisfied: %d%f%i%s%x";
因此,第一个可能会崩溃,因为字符串未终止,并且根据应用程序的状态,基本上可以读取它,直到它超过缓冲区(良好的实现应防止此防御),或者恰好碰到引起崩溃的格式指定符...这也用于任何垃圾数据。
第二个涉及variadic函数的工作方式...所有变量都以某种顺序推到堆栈,并且该函数没有安全的方法来知道最后一个是...将不断抓住指定的东西,直到它从堆栈中抓住东西并(也许)崩溃为止。
在第二个示例中也是第三种方法...如果您有一个%s,它将导致指针被删除...所以也可能崩溃。