Linux下C程序编译正常但运行出现Segmentation Fault (core dump)求助
解决你的Segmentation Fault (Core Dump)问题
嘿,我看到你已经把问题范围缩小到文件写入部分了,咱们直接来揪出代码里的关键bug:
1. 致命的赋值/比较混淆错误
你代码里的这一行是核心问题:
if (f=NULL) {
这里你用了赋值运算符=,而不是判断相等的**==**。这就导致你直接把NULL塞给了文件指针f,后续不管你要往文件里写什么,都会因为访问空指针触发段错误——毕竟NULL指针指向的是无效内存地址呀。
正确的写法应该是:
if (f == NULL) {
2. 几个额外的小建议
- 当文件打开失败时,除了打印"ERROR",最好直接终止程序(比如用
exit(1),记得要包含<stdlib.h>头文件),别让程序带着空指针继续跑,不然还会出问题。 - 你贴的代码里
salt[] = "$1$........";后面好像没写完,确保后续使用这个salt的时候是完整有效的,避免其他潜在的奇怪问题。 - 记得文件用完后一定要调用
fclose(f)关闭它,不然会造成资源泄漏哦。
给你贴个修正后的开头示例,方便你参考:
#include <stdio.h> #include <time.h> #include <unistd.h> #include <crypt.h> #include <string.h> #include <stdlib.h> // 要包含exit函数的头文件 int main(void) { FILE *f = fopen("shadow1.txt","w"); if (f == NULL) { printf("ERROR: 打开文件失败\n"); exit(EXIT_FAILURE); // 直接终止程序,避免后续错误操作 } // 后续的salt定义、加密逻辑和文件写入操作... // 操作完成后关闭文件 fclose(f); return 0; }
对了,以后可以养成一个小习惯:把常量写在比较运算符的左边,比如if (NULL == f),这样如果不小心写成=,编译器会直接报错——毕竟你不能给常量赋值嘛,能提前避免这类低级错误~
内容的提问来源于stack exchange,提问作者JHk1821
相关产品推荐
相关产品推荐

