【发布时间】:2015-02-17 19:03:59
【问题描述】:
这里的代码出现分段错误。
gdb:
Program received signal SIGSEGV, Segmentation fault.
_IO_fgets (buf=0x601080 <rc> "", n=100, fp=0x0) at iofgets.c:50
50 iofgets.c: No such file or directory.
代码:
#include <unistd.h>
#include <stdio.h>
char rc[100];
FILE *fp;
int status;
void main() {
fp = popen("sudo lshw |", "grep UUID");
if (fp == NULL)
printf("NULL pointer");
while (fgets(rc, 100, fp) != '\0')
printf("%s", rc);
status = pclose(fp);
if (status == -1) {
printf("pclose error");
/* Error reported by pclose() */
} else{
printf("Unknown error");
}
//return 0;
}
我猜是空指针?我尝试了给出的解决方案,但没有奏效。我猜是个愚蠢的错误
对不起,shell 命令将 b sudo dmidecode | grep UUID
【问题讨论】:
-
请编辑问题以在崩溃发生时显示完整的函数调用堆栈。问题不在库代码中,而在您的代码中。
-
你的变量都是全局变量有什么好的理由吗?我看到你声明了
void main()而不是int main()这是正确的方式,并评论了return 0;。 -
我猜您可能希望打印该错误消息而不是继续从无效文件指针读取,而不是另外。
-
另请注意,
fgets返回的缓冲区(或NULL)不是单个字符。 -
@JohnBollinger
NULL和'\0'在某些编译器上恰好相同并不意味着它们总是如此。NULL是“空”指针,'\0'是字符,它们本质上是不同的并且比较这两者(如果编译器允许并且不对你尖叫)将导致未定义的行为。
标签: c segmentation-fault